计算字符串中除空格外的所有字符

Count all characters in a string but spaces

到目前为止,在我的 C 代码中,它计算用户给定字符串中的所有内容,但是,我只希望它计算字母。

每当我尝试取出或更改空格计数器时,我的代码最终都会崩溃并迫使我手动停止它。

我想稍后使用空格作为计算单词的方法,但我宁愿尝试先完成字母。

我所说的中断是指代码将继续无限地无所事事。当我没有放下东西而是打印它时,我发现了这一点,它不停地重复给出的内容。

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>

int main(void)
{   
    string s = get_string("Text: ");
    int n = 0;

    while (s[n] != '[=10=]')
    {
        if (isalpha(s[n])) //counts letters
        {
            n++;
        }
        else
        {

        }
    }

我想尝试保持代码相似,但如果它更简单,则采用不同的方式。

另外,我想将其保留在能够处理用户提供的字符串的位置。

如果仔细观察周期:

while (s[n] != '[=10=]')
{
    if (isalpha(s[n])) //counts letters
    {
        n++;
    }
}

您会注意到,当 s[n] 不是 alpha 时,n 不会递增,因此您陷入了无限循环。

计数器和迭代器应该是不同的变量:

int count = 0;
//...
while (s[n] != '[=11=]')
{
    if (isalpha(s[n])) 
    {
        count++; //counts letters
    }
    n++; //increment iterator
}

由于 else 语句,一旦遇到非字母字符,就会出现无限循环

int n = 0;

while (s[n] != '[=10=]')
{
    if (isalpha(s[n])) //counts letters
    {
        n++;
    }
    else
    {

    }
}

你必须使用两个变量。第一个是存储字母个数,第二个是遍历一个字符数组

在这种情况下,最好使用 for 循环而不是 while 循环。

例如

size_t n = 0;

for  ( size_t i = 0; s[i] != '[=11=]'; i++ )
{
    if ( isalpha( ( unsigned char )s[i] ) ) //counts letters
    {
        n++;
    }
}

注意将变量n声明为有符号整数类型int是没有意义的。最好将其声明为无符号整数类型size_t。它是例如字符串函数 strlen 所具有的类型。