【问题标题】:Counter inside a for loop does not give expected outputfor循环内的计数器没有给出预期的输出
【发布时间】:2019-04-10 07:55:35
【问题描述】:

这个程序会扫描一些字符,并显示有多少'x' 被输入。 我想你会更好地了解代码而不是我解释。

#include<stdio.h>
main()
{
    int n,i,t=0;
    scanf("%d",&n);
    char ara[n];
    for(i=0;i<n;i++)
    {
        scanf("%c", &ara[i]);
        if(ara[i]=='x') t++;
    }
    printf("%d",t);
}

假设 n = 5 并且字符是 "xxxxxx"。在这种情况下,t 的值应该是5。但它显示4。

另一件事是,如果您删除第一个 scanf 语句(第 5 行)并在代码中的其他任何位置手动设置 n = 5 的值:

int n,i,t=0;
//scanf("%d",&n);
n = 5;

然后t 的值变为5 导致正确的输出。外部scanf函数是否有可能影响for循环内部的scanf函数?

【问题讨论】:

  • 您的输出是 100% 纯文本。请不要粘贴巨大的屏幕截图来显示 4 行测试。相反,您可以轻松地将文本直接复制并粘贴到问题中。
  • 好的!以后我会记得的:)
  • 现在编辑您的问题还为时不晚。 :) 只需单击问题下方的“编辑”,然后将文本图像替换为文本本身。
  • 请注意,您应该使用main 的正确签名之一,例如int main(void)。

标签: c for-loop variable-assignment


【解决方案1】:

这是因为当您输入 n 时,您也输入了换行符(或空格)。这个空格留在缓冲区中,所以读入的第一个字符不是x,而是那个空格字符。

您可以通过告诉scanf 跳过前导空格来解决此问题。改变这一行

scanf("%c", &ara[i]);

到这里:

scanf("%c", &ara[i]);

%c 前面的空格使其忽略换行符/空格,取而代之的是输入第一个 x,从而为您提供正确的结果。 reference 是这样解释的:

空格字符:该函数将读取并忽略任何空格 在下一个非空白字符之前遇到的字符 (空白字符包括空格、换行符和制表符—— 见 isspace)。格式字符串中的单个空格验证任何 从流中提取的空白字符的数量(包括 无)。

【讨论】:

    【解决方案2】:

    在您输入 5 之后,您的 ara 数组包含换行符。要丢弃这个换行符(以及第一个 'x' 之前的所有换行符和空格),您应该在 %d 之后放置空格:

    scanf("%d ",&n);
    

    编辑

    您可以在“%c”之前添加一个空格,就像@Blaze 的答案一样,但随后的输入将被误读:

     5
     x x x x x
    

    它将被读作'x', 'x', 'x', 'x', 'x' 而不是'x', ' ', 'x', ' ', 'x'。

    附录:

    如果您只想丢弃一个换行符,而不是所有换行符:

    scanf("%d",&n);
    while (true) {
        char ch = getchar();
        if (ch == EOF || ch == '\n') break;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2019-09-07
      相关资源
      最近更新 更多