【问题标题】:Count length and number of words in string计算字符串中的长度和单词数
【发布时间】:2017-05-17 19:31:39
【问题描述】:

我是 C 的初学者。我正在尝试打印用户输入的字符串中的长度和单词数。我在处理单词计数方面遇到了麻烦。我尝试扫描空格字符 的编号,然后将结果加1。保证每个单词只用一个空格隔开。

我执行了代码,并输入了

I go to school by bus.

第二个输出不是我预期的

22
24

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

代码如下

#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;
}

出了什么问题,我怎样才能得到正确的输出?

【问题讨论】:

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

标签: c string


【解决方案1】:
if(in[i]=' '){

永远是真的,你需要把它改成

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

【讨论】:

    【解决方案2】:

    我在您的代码中看到了 2 个错误。

    1. if(in[i]=' ') 应该是 if(in[i]==' ')

    == 检查两个操作数的值是否相等。如果是,则条件为真。

    = 简单赋值运算符。将右侧操作数的值分配给左侧操作数。

    1. i&lt;=cw 应该是 i&lt;cw

    索引在 C 中从 0 开始。

    【讨论】:

      【解决方案3】:

      正如 Pras 所说,在 ifs 上您通常使用 ==,因为您正在比较并且它返回 true 或 false 如果你只是使用 = 它属性(插入)一个值在右边到左边。

      【讨论】:

        【解决方案4】:

        您应该在检测空格的 if 语句中使用 == 而不是 =。

        如果将数字分配给非零值,则赋值运算符 = 总是为真。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-02
          • 2014-02-20
          • 2019-04-24
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 2016-05-21
          • 2023-03-21
          相关资源
          最近更新 更多