C 计算字符串中的字长和字数

C 计算字符串中的字长和字数,c,string,C,String,我是C语言的初学者。我试图打印出用户输入的字符串的长度和字数。我在计算字数方面有困难。我尝试扫描空格字符的编号,然后在结果中添加1。保证每个单词之间只有一个空格 我执行代码,然后输入 I go to school by bus. 第二个输出并不像我预期的那样 22 24 22是正确的,因为它确实是字符串的长度,但我不明白为什么它打印24而不是5个空格加1的6个结果 代码如下 #include<stdio.h> #include<string.h> int main()

我是C语言的初学者。我试图打印出用户输入的字符串的长度和字数。我在计算字数方面有困难。我尝试扫描空格字符的编号,然后在结果中添加1。保证每个单词之间只有一个空格

我执行代码,然后输入

I go to school by bus.
第二个输出并不像我预期的那样

22
24
22是正确的,因为它确实是字符串的长度,但我不明白为什么它打印24而不是5个空格加1的6个结果

代码如下

#include<stdio.h>
#include<string.h>
int main(){
    char in[256];
    int cl=0,cw,i;
    scanf("%[^\n]",&in);
    cw=strlen(in);
    for(i=0;i<=cw;i++){
        if(in[i]=' '){
            cl=cl+1;
        }
    }
    printf("%d\n",cw);
    printf("%d\n",cl+1);
    return 0;
}
出了什么问题,如何获得正确的输出

if(in[i]=' '){
永远都是真的,你需要把它改成

if(in[i]==' '){
永远都是真的,你需要把它改成

if(in[i]==' '){

我在你的代码中看到了两个错误

ifin[i]=''应为ifin[i]='' ==检查两个操作数的值是否相等。如果是,则条件变为真

=简单赋值运算符。从右侧操作数向左侧操作数赋值


我在你的代码中发现了两个错误

ifin[i]=''应为ifin[i]='' ==检查两个操作数的值是否相等。如果是,则条件变为真

=简单赋值运算符。从右侧操作数向左侧操作数赋值


i在检测空间的if语句中应该使用==而不是=

如果将数字赋值为非零值,则赋值运算符=gives始终为真

等价运算符==实际上是比较两个数字是否具有相同值的运算符


可能令人惊讶的是,赋值运算符实际上至少可以在x860上测试一个数字是否为零。这是因为jz是测试指令之一,它检查一个称为标志寄存器的东西,即一个特殊的内存位置,该位置包含有关最近执行的算术运算的信息做一个cmp,将两个数字相减,看看它是否为0。Jz代表跳转if zero,因此两个相等的数字导致跳转到if语句中的指令。当使用=时,编译器将使用jz,以符合c的思想,即if中的非零数为真,这将导致上述行为。

在检测空间的if语句中,应该使用==而不是=

如果将数字赋值为非零值,则赋值运算符=gives始终为真

等价运算符==实际上是比较两个数字是否具有相同值的运算符


可能令人惊讶的是,赋值运算符实际上至少可以在x860上测试一个数字是否为零。这是因为jz是测试指令之一,它检查一个称为标志寄存器的东西,即一个特殊的内存位置,该位置包含有关最近执行的算术运算的信息做一个cmp,将两个数字相减,看看它是否为0。Jz代表跳转if zero,因此两个相等的数字导致跳转到if语句中的指令。当使用=时,编译器使用jz来代替,以符合c的思想,即if中的非零数为真,这会导致上述行为。

正如Pras所说,在ifs上通常使用==,因为您正在进行比较,并且它返回真或假
如果您只使用=it属性,请在从右到左插入一个值。

正如Pras所说,在ifs上,您通常使用==,因为您正在进行比较,它会返回true或false
如果只使用=it属性,请从右向左插入一个值。

@xing为什么这里需要这样做?这是一个很好的做法,但不是错误原因这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。虽然类似的问题可能在这里的主题,这是一个解决的方式不太可能帮助未来的读者。这通常可以通过在发布之前识别并仔细检查重现问题所需的最短程序来避免。@xing cl已初始化为0,cw由strlen初始化,i由for i=0;初始化;。。。。我粘贴了一个过时的代码,它在我的剪贴板中,cl还没有初始化。我的错。@xing为什么这里需要这样?这是一个很好的做法,但不是错误原因这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。虽然类似的问题可能在这里的主题,这是一个解决的方式不太可能帮助未来的读者。这通常可以通过在发布之前识别并仔细检查重现问题所需的最短程序来避免。@xing cl已初始化为0,cw由strlen初始化,i由for i=0;初始化;。。。。我粘贴了一个过时的代码,它在我的剪贴板中,cl还没有初始化。是我的错。