我有这个有效的代码:
int main()
{
char a[100];
int i;
int n=3;
for(i=1;i<=n;i++){
printf("insert char \n");
scanf("%c",&a[i]);
getchar();
}
for(i=1;i<=n;i++){
printf("%c ",a[i]);
}
}
我插入一个b c他打印出一个b c,到目前为止,我希望能够用scanf插入大小n,但是如果我像这样放置一个n的scanf:
int main()
{
char a[100];
int i;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("insert char \n");
scanf("%c",&a[i]);
getchar();
}
for(i=1;i<=n;i++){
printf("%c ",a[i]);
}
}
当我运行程序时,它在第二个for循环中引起问题,我输入b c,第二个for返回空字符,实际上在每个程序完成“ PROCESS RETURNED etc.”时,换行了n次。打印。当我运行第一个代码时,字符将打印在同一行上,而在下一行中,将显示“ PROCESS RETURNED”,而在插入n个空行后将显示第二个代码,然后打印“ PROCESS RETURNED”,即使我没有在\ printf中写入\ n。我试图查看n是否与a的某些元素(带有printf(“%p”,&[i])或printf(“%p”,&a)和printf(“%p “,&n)),但地址不同。有想法吗?
如果是第一个程序,因为您先是scan
字符,则缓冲区中没有内容,然后调用getchar
,它将以\n
作为输入,但是在第二个程序中,输入int n
后,您的缓冲区中有一个\n
(scanf
仅取一个整数,并将\n
留在缓冲区中),因此,当您为字符调用scanf
时,它将以\n
作为输入。
所以我建议在scanf
中添加一个空格:
for(i=1;i<=n;i++){
printf("insert char \n");
scanf(" %c",&a[i]);//add space here
}
问题是,在您读入n
后,新行字符'\n'
将保留在输入缓冲区中,而您的第二个scanf
将读取该行字符。之后,getchar()
将吃掉实际的输入字符,而新的'\n'
将保留在缓冲区中。
读取getchar()
后必须使用n
,因为换行符'\ n'将保留在输入缓冲区中,并且您在scanf
循环中的第二个for
将读取该字符。
此外,您还应该从索引0
开始。您可以尝试以下代码。
int main()
{
char a[100];
int i;
int n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++){
printf("insert char \n");
scanf("%c",&a[I]);
getchar();
}
for(i=0;i<n;i++){
printf("%c ",a[I]);
}
}