还有c中char数组的scanf问题?

问题描述 投票:0回答:3

我有这个有效的代码:

 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)),但地址不同。有想法吗?

c arrays input char scanf
3个回答
1
投票

如果是第一个程序,因为您先是scan字符,则缓冲区中没有内容,然后调用getchar,它将以\n作为输入,但是在第二个程序中,输入int n后,您的缓冲区中有一个\nscanf仅取一个整数,并将\n留在缓冲区中),因此,当您为字符调用scanf时,它将以\n作为输入。

所以我建议在scanf中添加一个空格:

 for(i=1;i<=n;i++){
                printf("insert char \n");
                scanf(" %c",&a[i]);//add space here
            }

0
投票

问题是,在您读入n后,新行字符'\n'将保留在输入缓冲区中,而您的第二个scanf将读取该行字符。之后,getchar()将吃掉实际的输入字符,而新的'\n'将保留在缓冲区中。


0
投票

读取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]);
  }
 }
© www.soinside.com 2019 - 2024. All rights reserved.