【问题标题】:For loop scans one less time in cfor循环在c中少扫描一次
【发布时间】:2015-09-26 05:02:30
【问题描述】:

用户输入一个字符串,但在此之前他输入了字符串的大小。然后我必须阅读并计算每个字母输入了多少次。

这是我的代码:

#include <stdio.h>

char ab[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; //Size = 26

int main(void)
{

  int i, j, size, counter[26];
  char temp;

  for(i=0; i<26; i++)
  { 
      counter[i]=0;
  }

  scanf("%d",&size);

  for(i=0; i<size; i++)
  {
    scanf("%c",&temp);

    for(j=0; j<26; j++)
    {
          if(ab[j]==temp)
          {
            counter[j]++;
              break;
          }
      }
  }

  for(i=0; i<26; i++) 
  {
      printf("We have %d %c\n",counter[i],ab[i]);
  }

  return 0;

}

这是我的问题:
在给定的代码中,读取的 for 循环最后一次执行。因此,例如,如果您输入 7,即使它从 0 开始,它也会执行 6 次而不是 7。您知道问题出在哪里吗?

【问题讨论】:

    标签: c loops for-loop scanf


    【解决方案1】:

    问题在于%c 不会像%f%d 等数字格式那样跳过空格。

    以下scanf 可用于跳过空格,然后读取下一个非白色字符。

    scanf("%*[ \n\t]%c",&temp);

    * 表示丢弃读取的内容,不要将其存储在输出变量中。 [...] 表示读取与括号之间的字符匹配的任何字符序列,在本例中为空格、换行符或制表符。

    【讨论】:

    • 如果输入缺少前导空格、换行符或制表符,scanf("%*[ \n\t]%c",&amp;temp); 不会扫描任何内容到 temp
    【解决方案2】:

    将您的代码更改为

    #include <stdio.h>
    
    int main(void) {
        char ab[] = "abcdefghijklmnopqrstuvwxyz", temp;
        int i, j, size, counter[26] = {0};
        scanf("%d", &size);
        for (i = 0; i <= size; ++i) {   // One more iteration for the loop
            scanf("%c", &temp);
            for (j = 0; j < 26; ++j) {
                if (ab[j] == temp) {
                    counter[j]++;
                    break;
                }
            }
        }
        for (i = 0; i < 26; ++i)
            printf("We have %d %c\n", counter[i], ab[i]);
        return 0;
    }
    

    但是,更喜欢一次读取字符串而不是逐个字符地读取

    char str[size + 1];
    scanf("%s", str);
    

    【讨论】:

      【解决方案3】:
      for(i=0; i<size; i++){
      

      size 为 7 时将循环 7 次。

      你的问题如下:

      你输入一个数字

      scanf("%d",&size);
      

      然后按 Enter。上面的scanf 扫描数字并将换行符('\n')留在标准输入流中。在第一个循环的第一次迭代中,

      scanf("%c",&temp);
      

      看到换行符并因此消耗它,使您认为循环执行的时间减少了 1 次。您可以通过添加

      来验证这一点
      printf("Got '%c'", temp);
      

      在循环中的scanf 之后。

      使用修复它

      scanf(" %c",&temp);
      

      %c 之前的空格会丢弃所有 whitespace characters,包括在第一个非空白字符之前的任何一个空格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2017-11-29
        • 2017-03-30
        • 1970-01-01
        • 2013-02-13
        相关资源
        最近更新 更多