计算C中的字符

Jam*_*mes 6 c character count

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

for(m=0; z[m] != 0; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何协助赞赏.

编辑*如果像这样扫描输入(字符串),它会有所不同吗?是的,一切都已初始化.我已经尝试打印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 ++;
                }
        }
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

你需要初始化charcount.除此之外,它应该工作,只要它z是一个零终止的字符数组并且mint或类似的.我可能会写z[m]而不是z[m] != 0(因为!0 = true和0 = false),但两者都有效.有更有效的方法(虽然这些天我打赌编译器将处理将其转换为基于指针的循环).

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

const char * z = "testing one two three";
int m;
int charcount;

charcount = 0;
for(m=0; z[m]; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


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

  • `'\ 0'`和`0`是一样的.一个并不比另一个更正确.也许,一个人可以比另一个人更时尚. (5认同)
  • @pmg:不,他们不是.`'\ 0'`是`char`,`0`是`int`.不过,这个区别对于这段代码没什么影响. (2认同)
  • 试试这个:`sizeof'\ 0'`.我不认为我曾经见过`C`中的文字字符(除了`char []`之外). (2认同)
  • @TJ:C99,§6.4.4.42:"整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'." §6.4.4.410:"整数字符常量的类型为int." (2认同)