1

我刚刚开始编写代码,我需要帮助弄清楚为什么这个循环会计算字符串中的空格。

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

int main(void)
{

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

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

    printf("%i", lettercount);

    printf("/n");
}
4

5 回答 5

3

\0表示空字符,而不是空格。它位于字符串的末尾以指示它们的结尾。要仅检查空格,请在循环内添加条件语句。

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

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

    printf("%i", lettercount);

    printf("\n");
}
于 2020-07-09T15:57:36.810 回答
1

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

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

于 2020-07-09T15:57:56.153 回答
1

您误解了 C 字符串的性质。

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

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

一个简单的改变:

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

将使您的程序正常工作。

于 2020-07-09T15:58:53.153 回答
1

这个for循环

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

迭代直到当前字符是'\0'作为空字符的终止零字符。所以字符不计算在内。

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

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

所以用以下方式编写循环会更正确

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 );
于 2020-07-09T17:04:39.000 回答
0

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

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

\0 - null terminator | ' ' - a 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] != '\0'
    // 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

如果字符串文字没有任何空终止符,那么除非程序员手动给出最大数量的元素以供读取,否则无法阻止它被读取。

于 2020-07-09T16:07:44.720 回答