计数字符串中的字母将返回不正确的数字

Counting letters in a string returns incorrect number

本文关键字:数字 返回 不正确 字符串      更新时间:2023-10-16

老师要我们写一个程序,计算输入字符串中的字母(a-z, a-z)、数字和特殊字符的数量。我们只允许使用<iostream>

我的程序正确地计数字母,但是我不能得到数字或其他字符的正确计数。下面是我的代码:

#include <iostream>   //preprocessor directive
using namespace std;
//preprocessor directives

int main ()
{
//declare and initialize variables
    char s[50];
    int i;
    int letter = 0;
    int number = 0;
    int other = 0;

//user input
    cout << "Enter a continuous string of characters with no blank spaces" << endl;
    cout << "(example: aBc1234!@#$%)" << endl << endl;
    cout << "Enter your string: ";
    cin >> s;
    cout <<endl;
//loop through the string
//count letters
    i = 0;
    while (s[i] !=0)
    {
    if ((s[i] >= 'a' && s[i] < 'z') ||
        (s[i] >= 'A' && s[i] < 'Z'))
        letter++;
    i++;
    }
//count numbers
    {
    if ((s[i] >= '0' && s[i] < '9'))
        number++;
    i++;
    }
//count other
    {
    if ((s[i] >= '!' && s[i] < ')'))
        other++;
    i++;
    }
//output results
    cout << "Your string has " << letter << " letters" << endl;
    cout << number << " numbers, and " << endl;
    cout << other << " other characters" << endl;

    return 0;
}

让我们一步一步来。我假设你还没有接触过for循环,对于这种类型的迭代问题来说,for循环要清晰得多,所以我们现在将坚持使用while循环。你的代码直到while循环都很好,所以我将忽略它。当你进入while循环时,你创建了一个变量i来跟踪你的进程,同时循环遍历字符数组,然后告诉while语句循环直到遇到0,这代表null字符(我实际上将0更改为'',这是完全相同的事情,但更清楚地说明了你的意图)。这意味着你的循环将一个字符一个字符地遍历字符串,让你检查每一个字符。现在在while循环中有一个if语句检查当前索引i处的字符是否是一个字母。如果是,则增加字母计数。这正是你想要的。但是,当到达while循环执行块的末尾时,返回到条件语句,检查下一个字符是否为空字符,然后重复while块。处理检查字符是数字还是符号的if语句位于while循环之外,因此不会对字符串中的每个字符执行。相反,它们将只在s[i]上执行一次,s[i]将是空字符,因为这是while循环结束后i仍然指向的索引。您的解决方案应该是将这两个if语句移到while循环中,以便它们将对字符串中的每个字符运行。

顺便说一下,要小心你的性格测试。你没有包括所有的角色。例如,你包括所有字符,但不包括'Z'。确保将这些比较用<=表示。更重要的是,你对"其他"字符的检查只会捕捉到键盘上的一些其他字符。我不会确切地告诉你如何解决这个问题,因为这是学校的作业,但我会告诉你,它将涉及到使用else子句和你的if语句(或者更好的是else if语句)。如果你对它还不太了解,网上有一些很棒的教程。例如:http://www.cprogramming.com/tutorial/lesson2.html

祝你好运,玩得开心!