【问题标题】:Why is this still counting spaces within a String?为什么这仍在计算字符串中的空格?
【发布时间】:2020-10-30 06:46:45
【问题描述】:

我刚刚开始编写代码,我需要帮助弄清楚为什么这个循环会计算字符串中的空格。

据我了解,这段代码应该告诉计算机不要计算空格“/0”,如果循环遍历字符串并且它是任何其他字符,则增加计数。

int main(void)
{

    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

   for (int i = 0; t[i] != '\0'; i++)
    {
          lettercount++;
        
    }

    printf("%i", lettercount);

    printf("/n");
}

【问题讨论】:

  • '\0' 是 NUL,而不是空格。
  • 我认为 Nul 是什么代表字符串中的空格?
  • 空格' '是空格。
  • 澄清一下,什么时候使用NUL?
  • 看一下ascii表' '是32而\0是0,这不是同一个值

标签: c for-loop c-strings cs50 null-character


【解决方案1】:

\0 表示空字符,而不是空格。它位于字符串的末尾以指示它们的结尾。要仅检查空格,请在循环内添加条件语句。

int main(void)
{
    string t = get_string("Copy & Past Text\n");
    int lettercount = 0;

    for (int i = 0; t[i] != '\0'; i++)
    {
        if (t[i] != ' ')
            lettercount++;
    }

    printf("%i", lettercount);

    printf("\n");
}

【讨论】:

  • for (int i = 0; i < strlen(string); i++) 可以,但是for (int i = 0, n = strlen(string); i < n; i++) 因为不需要每次都检查字符串的长度。
  • 是的,我完全同意你们两个。我并没有仔细考虑,因为我不确定string 的定义是什么样的,strlen() 只是使用占位符函数来传达这个想法。我已经调整了我的代码以反映不应重复计算长度。 @ikegami,至于我为什么改,请看我回答的第二段。
  • 是的,我的错,完全误解了原始 for 循环的条件。我的答案已简化为仅添加条件。
【解决方案2】:

空格被认为是一个字符,您的代码遍历字符串(一个字符数组)并计算字符,直到它到达字符串终止字符'\0'。

编辑:在 if(t[i] != ' ') 循环中设置一个 if 条件,您将不再计算空格。

【讨论】:

    【解决方案3】:

    你误解了 C 字符串的本质。

    字符串是具有低值 ('\0') 的字符数组,用于标记字符串的结尾。在字符串中,一些字符可能是空格(' ' 或 x20)。

    所以“t[i] != '\0'”条件标志着循环的结束。

    一个简单的改变:

    if ( t[i] != ' ') {
        lettercount++;
    }
    

    将使您的程序正常运行。

    【讨论】:

      【解决方案4】:

      空终止符是由字符串文字组成的字符数组中的最后一个前导元素(例如Hello there!\0)。它终止一个循环并防止进一步继续读取下一个元素。

      请记住,空终止符不是空格字符。两者都可以用以下方式表示:

      \0 - null terminator | ' ' - a 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] != '\0'
          // 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
      

      如果字符串文字没有任何空终止符,那么除非程序员手动指定要读取的最大元素数,否则无法阻止它被读取。

      【讨论】:

        【解决方案5】:

        这个for循环

        for (int i = 0; t[i] != '\0'; i++)
        

        迭代直到当前字符是终止零字符'\0',它是一个空字符。所以这个字符不算在内。

        在 C 中,在标头 &lt;ctype.h&gt; 中声明了标准函数 isalpha,用于确定字符是否代表字母。

        请注意,例如,用户可以在字符串中输入标点符号。或者他可以使用制表符'\t' 代替空格字符' '。例如,他的输入可能看起来像"~!@#$%^&amp;",其中没有任何字母。

        所以这样写循环会更正确

        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 );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-06
          • 2014-04-02
          • 1970-01-01
          相关资源
          最近更新 更多