【问题标题】:Scanning a char array after scanning an integer in C在C中扫描整数后扫描char数组
【发布时间】:2016-06-09 11:22:45
【问题描述】:

我是编程新手。当我在扫描一个整数后输入一个 char 数组时,我感到很困惑。它无法正常工作。 代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[30];
    int x,y;
    scanf("%d",&x);
    scanf("%[^\n]",a);
    scanf("%d",&y);
    printf("%d\n%s\n%d",x,a,y);
    return 0;
}

输出如下:

【问题讨论】:

  • 这就是你检查scanf()的返回值的原因。
  • 这个我看不懂。
  • C11 标准草案 n1570:7.21.6.2 fscanf 函数返回 16 如果在第一次转换(如果有)完成之前发生输入失败,fscanf 函数将返回宏 EOF 的值。否则,该函数返回分配的输入项的数量,如果发生早期匹配失败,该数量可能少于提供的数量,甚至为零。
  • 除非答案建议检查来自scanf() 的返回值,否则这不是一个好的答案。节省时间 1) 始终检查输入函数的返回值。阅读文档以了解预期的返回值。 2) 使用fgets() 比使用scanf() 更好。

标签: c


【解决方案1】:

问题出在white spaces。在scanf("%d",&amp;x);之后,最后输入的'\n'字符被取出并保存a的字符串scanf("%[^\n]",a)


为避免这种情况,请在 scanf() 语句中留出空间

scanf(" %[^\n]",a);//give a space

为什么要给空间?

通过给一个空格,编译器使用'\n' 字符或任何 前一个 scanf() 的其他空白('\0','\t'' '


您的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[30];
    int x,y;
    scanf("%d",&x);
    scanf(" %[^\n]",a);//give a space
    scanf("%d",&y);
    printf("%d\n%s\n%d",x,a,y);
    return 0;
}

【讨论】:

  • 非常感谢。如果可能,请为我的问题投票。
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[30];
    int x,y;
    scanf("%d",&x);
    fflush(stdin);
    scanf("%[^\n]",a);
    fflush(stdin);
    scanf("%d",&y);
    printf("%d\n%s\n%d",x,a,y);
    return 0;
}

这也有效。这里也是一样,最后的/0加起来就是字符扫描和干扰。使用fflush(stdin) 将丢弃任何不必要的输入数据,包括/0。

如果我错了,请纠正我,因为我也是编码新手。 :p

【讨论】:

    【解决方案3】:

    scanf("%[^\n]",a); 替换为scanf(" %99[^\n]", a);

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char a[30];
        int x,y;
    
        scanf("%d",&x);
        scanf("%s",a);            // get char array without inputing space
        scanf(" %99[^\n]", a);    // get char array, allowing inputing space
        scanf("%d",&y);
        printf("%d\n%s\n%d\n",x,a,y);
        return 0;
    }
    

    【讨论】:

    • 你的替换顺序弄错了!
    • 但我想占用空间
    • @Murad 将 scanf("%s",a); 替换为 scanf(" %99[^\n]", a);,它可以工作。
    • @Murad 你不能要求投票。如果成员认为您的问题在此处提问之前已经过研究并且有有用的信息。
    • 没关系。我不知道这一点。
    【解决方案4】:

    而不是%d 使用%d\n 来使用换行符,这样下面的命令就不会只是读取任何内容:

    scanf("%d\n",&x);
    scanf("%[^\n]",a);
    scanf("%d",&y);
    printf("%d\n%s\n%d",x,a,y);
    

    【讨论】:

    • 但我想占用空间
    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多