为什么这仍然计算字符串中的空格?
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 );
我刚刚开始编写代码,我需要帮助来弄清楚为什么这个循环在一个字符串中计数 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 );