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