该计划没有按预期进行投入。当我输入t = 1
和l = 4
时,内部循环只需要两个输入而不是四个。
int main() {
int l, b, g, count, t, i;
char s[10000];
scanf("%d%d", &t, &l);
while (t--) {
for (i = 0; i < l; i++) {
scanf("%c", s[i]);
if (i > 0)
if (s[i] == s[i-1])
count++;
}
printf("%d\n", count);
}
getch();
}
答案 0 :(得分:3)
问题在于,当您为任何scanf
输入字符时,请按Enter键。输入(如果有效)由scanf
消耗,换行符(因为您按下回车键)保留在标准输入流(stdin
)中。当下次调用scanf
(带%c
)时,它会在\n
中看到stdin
字符并使用它,因此不会等待进一步输入。< / p>
要解决此问题,请更改
scanf("%c",s[i]);
要
scanf(" %c",&s[i]);
%c
指示scanf
扫描任意数量的空白字符(包括无字符)之前的空格,直到第一个非空白字符。引用标准:
带有7.21.6.2 fscanf功能
[...]
- 由白色空格字符组成的指令通过读取输入来执行 第一个非空格字符(仍未读取),或直到不再有字符 被阅读。该指令永远不会失败。
醇>
scanf
格式说明符的 %c
需要char*
或换句话说,char
的地址。您提供类型为s[i]
的参数char
。这将调用未定义的行为。 &
是运算符的地址,在s[i]
之前使用时,它会提供s[i]
的地址,即char*
。
答案 1 :(得分:0)
int main(){
int l,b,g,count,t,i;
char s[10000];
scanf("%d%d",&t,&l);
getchar();
while(t--){
for(i=0;i<l;i++){
scanf("%c",s[i]);
if(i>0)
if(s[i]==s[i-1])
count++;
}
printf("%d\n",count);
}
getch();
}
这两个getchars用于清除&#39; \ n&#39;就在输入缓冲区中。虚拟的getchars只是采取了额外的&#39; \ n&#39;这将解决问题。