for循环内的计数器未提供预期的输出

时间:2019-04-10 07:55:36

标签: c for-loop variable-assignment

该程序扫描某些字符,并显示输入了多少'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函数?

2 个答案:

答案 0 :(得分:1)

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

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

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

对此:

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

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

  

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

答案 1 :(得分:1)

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

scanf("%d ",&n);

修改

您可以像在@Blaze的答案中那样在“%c”之前加一个空格,但是类似以下的输入将被误读:

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