【问题标题】:yet another problem with scanf of char arrays in c?c语言中char数组的scanf还有另一个问题吗?
【发布时间】:2020-07-17 13:23:45
【问题描述】:

我有这个工作的代码:

 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]);
        }
    }

我插入 a b c 他打印 a 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 循环中导致问题,我输入 a b c,第二个 for 返回空字符,实际上在 C 中换行 n 次,当每个程序完成“PROCESS RETURNED 等”时。被打印。当我运行第一个代码时,字符被打印在同一行,并且在下一行有“PROCESS RETURNED”,而不是插入后的第二个代码 n 空行被打印,然后“PROCESS RETURNED”即使我没有在 printf 中写入 \n。我试图查看 n 是否存储在与 a 的某些元素相同的位置(使用 printf ("%p", & a [i]) 或 printf ("%p", & a) 和 printf ("%p ", & n )),但地址不同。有什么想法吗?

【问题讨论】:

    标签: c arrays input char scanf


    【解决方案1】:

    如果第一个程序,因为你scan 字符第一个,缓冲区中没有任何内容,那么你调用getchar,它将\n 作为输入,但是在第二个程序中输入int n 之后,你有一个\n buffer(scanf 只取一个整数并将\n 留在缓冲区中) ,因此当您为您的角色调用scanf 时,它会将\n 作为输入。

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

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

    【讨论】:

    • 谢谢,所以它可以工作,但我不明白为什么,如果在“printf(”insert char\n“)”我不写“\n”我仍然有同样的错误输出即空行
    • @gianlucavallo 提示:使用fgets() 读取用户输入的,然后对其进行解析。在你知道它为什么不好之前不要使用scanf()
    • @gianlucavallo 这与printf 无关。在您的scanf 函数中,为了将int n 作为输入,您将输入一个整数,然后按enter 键。 .这里scanf 将该整数作为输入,但将通过按enter key 输入的\n 保留在缓冲区中。
    • @gianlucavallo scanf 完全按照您所说的那样,如果您使用scanf("%d",&amp;n),它将采用intn`,仅此而已。这意味着当您按下回车键时,由它创建的\n 字符将留在缓冲区中。
    • @gianlucavallo 随意,无需感谢,但如果这有帮助,请接受答案。
    【解决方案2】:

    您必须在读取 n 后使用 getchar(),因为换行符 '\n' 将保留在输入缓冲区中,而您在 for 循环中的第二个 scanf 将读取它。

    您还应该从索引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]);
      }
     }
    

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 2021-06-29
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2015-06-23
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多