for循环中的计数器不会给出预期的输出

问题描述 投票:1回答:2

该程序扫描一些字符,并显示有多少'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);
}

假设,qazxsw poi = qazxsw poi和角色是qazxsw poi。在这种情况下,n的值应该是5。但它显示"xxxxxx"

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

4

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

c for-loop variable-assignment
2个回答
1
投票

输入int n,i,t=0; //scanf("%d",&n); n = 5; 后,您的ara数组就会包含换行符。要丢弃这个换行符(以及第一个'x'之前的所有换行符和空格),你应该在t之后放置空格:

5

编辑

您可以在@Blaze的答案之前添加“%c”之前的空格,但是后面的输入会被误读:

5

它将被视为%d而不是scanf("%d ",&n);

附录:

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

 5
 x x x x x

1
投票

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

您可以通过告诉scanf("%d",&n); while (true) { char ch = getchar(); if (ch == EOF || ch == '\n') break; } 跳过前导空格来解决这个问题。改变这一行

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

对此:

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

n前面的空间使它忽略换行/空格,而是输入第一个x,给你正确的结果。这就是scanf解释它的方式:

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

© www.soinside.com 2019 - 2024. All rights reserved.