计算C中的字符

我正在尝试编写一个计算字符串中所有字符的程序。 我原本拥有它,但后来意识到我无法计算空间。 我不明白为什么这不起作用。

for(m=0; z[m] != 0; m++) { if(z[m] != ' ') { charcount ++; } } 

任何协助赞赏。

编辑*如果像这样扫描输入(字符串),它会有所不同吗? 是的,一切都已初始化。 我已经尝试打印z [m]评估的内容并且它不是“m”处字符串的实际值,我认为这是问题所在。

 for(j=0; j<7; j++){ printf("Enter a string:\n"); scanf("%s", z); for(m=0; z[m] != 0; m++){ if(z[m] != ' '){ charcount ++; } } 

您需要初始化charcount 。 除此之外,它应该工作,前提是z是一个以零结尾的字符数组,而m是一个int或类似的。 我可能只写z[m]而不是z[m] != 0 (因为!0 =真,0 =假),但两者都有效。 有更有效的方法(虽然这些天我打赌编译器会处理将它转换为基于指针的循环)。

这是一个完整,正确的示例,只需进行少量编辑:

 const char * z = "testing one two three"; int m; int charcount; charcount = 0; for(m=0; z[m]; m++) { if(z[m] != ' ') { charcount ++; } } 

如果您正在使用某种类型的String类而不是旧式的C null终止数组,那么您将需要查看该类以了解如何循环它。

以上所有内容也假设您正在处理ASCII字符串。 如果您正在处理UTF编码的字符串,则必须处理多字节字符。


重新编辑:它有很大的不同: scanf将停在第一个空白处 (我忘记了)。 但是,如果你没有正确地声明z ,它可能会产生更大的差异。 (我还建议在使用scanf读取字符串时使用字段宽度[或完全避免使用scanf ];否则,您无法控制它将尝试存储的字符数,因此理论上 ,不会有缓冲区大到足以避免溢出。更多信息: http : //www.crasseux.com/books/ctutorial/String-overflows-with-scanf.html )

你可以使用strlen()

我建议使用while循环,并使用更有意义的变量名称

 m = textIndex z = text 

像这样的东西会起作用

 while (text[textIndex] != 0x00) { textIndex++; } 

而不是使用scanf,尝试这样的fgets:

 char input[256]; fgets(input, sizeof(input), stdin); 

fgets将从文件中读取行。 因此,将stdin作为文件句柄传递将使其从标准输入读取,这在大多数情况下将绑定到控制台。 但要注意的一件事是,从fgets获得的字符串可能包含换行符。 我建议使用ctype.h中的isspace函数,它将检查各种forms的空白(包括常规空格和换行符),而不是使用空格字符(”)显式检查字符串中的不等式。

这是一个完整的,可运行的示例:

 #include  #include  int count_nonspace(const char* str) { int count = 0; while(*str) { if(!isspace(*str++)) count++; } return count; } int main() { char input[256]; fgets(input, sizeof(input), stdin); printf("%d\n", count_nonspace(input)); } 

是的,输入扫描与scanf有所不同:

  scanf("%s", z); ... if(z[m] != ' '){ 

scanf(“%s”…)总是在空格字符处断开,因此你的确如此 。 更好地使用fgets从stdin读取,

 #define MAXINPUT 80 char line[MAXINPUT]; for(j=0; j<7; j++) { printf("Enter a string:\n"); if( fgets( line, 80, stdin ) ) { char *c=line; if( strchr(line,'\n') ) *strchr(line,'\n')=0; while( *c ) { if( *c!=' ' ) ++charcount; ++c; } } } 

或者,如果你想要WHITE -spaces,那就拿

 #include  ... if( !isspace(*c) )