为什么这仍然计算字符串中的空格?

Why is this still counting spaces within a String?

我刚刚开始编写代码,我需要帮助来弄清楚为什么这个循环在一个字符串中计数 spaces。

根据我的理解,这段代码应该告诉计算机不要对 space“/0”进行计数,如果循环遍历字符串并且它是任何其他字符则增加计数。

int main(void)
{

    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

   for (int i = 0; t[i] != '[=10=]'; i++)
    {
          lettercount++;
        
    }

    printf("%i", lettercount);

    printf("/n");
}

[=11=]代表空字符,不是space。它位于字符串的末尾以指示它们的结束。要仅检查 spaces,请在循环内添加条件语句。

int main(void)
{
    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

    for (int i = 0; t[i] != '[=10=]'; i++)
    {
        if (t[i] != ' ')
            lettercount++;
    }

    printf("%i", lettercount);

    printf("\n");
}

Space 被认为是一个字符,您的代码遍历字符串(字符数组)并对字符进行计数,直到它到达字符串终止字符 '\0'。

编辑:在循环 if(t[i] != ' ') 中设置一个 if 条件,这样您就不会再计算空格了。

你误解了 C 字符串的本质。

字符串是一个字符数组,低值 ('\0') 标记字符串的结尾。在字符串中,某些字符可能是空格(' ' 或 x20)。

因此“ t[i] != '\0' ”条件标志着循环的结束。

一个简单的改变:

if ( t[i] != ' ') {
    lettercount++;
}

将使您的程序运行。

空终止符是由字符串文字组成的字符数组中的最后一个前导元素(例如 Hello there![=13=])。它终止循环并阻止进一步继续读取下一个元素。

请记住,空终止符不是 space 字符。两者都可以用以下方式表示:

[=10=] - null terminator | ' ' - a space

如果你想计算 space 以外的字母,试试这个:

#include <stdio.h>

#define MAX_LENGTH 100

int main(void) {
    char string[MAX_LENGTH];
    int letters = 0;

    printf("Enter a string: ");
    fgets(string, MAX_LENGTH, stdin);

    // string[i] in the For loop is equivalent to string[i] != '[=11=]'
    // or, go until a null-terminator occurs
    for (int i = 0; string[i]; i++)
        // if the current iterated char is not a space, then count it
        if (string[i] != ' ')
            letters++;

    // the fgets() reads a newline too (enter key)
    letters -= 1;

    printf("Total letters without space: %d\n", letters);

    return 0;
}

你会得到类似的东西:

Enter a string: Hello world, how are you today?
Total letters without space: 26

如果字符串文字没有任何空终止符,则无法阻止读取它,除非程序员手动指定要读取的最大元素数。

这个for循环

for (int i = 0; t[i] != '[=10=]'; i++)

迭代直到当前字符是终止零字符 '[=15=]' 即空字符。所以字符不算。

在 C 中有一个标准函数 isalpha 在 header <ctype.h> 中声明,它确定一个字符是否代表一个字母。

注意用户可以在字符串中输入标点符号。或者他可以使用制表符 '\t' 而不是 space 字符 ' '。例如,他的输入可能看起来像 "~!@#$%^&",其中没有任何字母。

所以循环写成下面这样比较正确

size_t lettercount = 0;

for ( string s = t; *s; ++s )
{
    if ( isalpha( ( unsigned char )*s ) ) ++lettercount;
}

printf("%zu\n", lettercount );

此声明

printf("/n");

将被删除。我想你的意思是

printf("\n");

也就是你要输出换行符'\n'。但是这个字符可以插入到 printf 的前一个调用中,正如我在上面显示的

printf("%zu\n", lettercount );