在C中扫描整数后扫描char数组

Posted

技术标签:

【中文标题】在C中扫描整数后扫描char数组【英文标题】:Scanning a char array after scanning an integer in C 【发布时间】: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 is not scanning %c character but skips the statement, why is that?的可能重复 除非答案建议检查来自scanf() 的返回值,否则这不是一个好的答案。节省时间 1) 始终检查输入函数的返回值。阅读文档以了解预期的返回值。 2) 使用fgets() 比使用scanf() 更好。 【参考方案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);

【讨论】:

但我想占用空间

以上是关于在C中扫描整数后扫描char数组的主要内容,如果未能解决你的问题,请参考以下文章

获取字符串后,在单个scanf中取字符串和整数会跳过其余的整数,为什么?如何在单扫描中完成?

bzoj4540[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改

C语言冒泡排序

有没有办法绕着扫描仪(Java)推进一条线

调整数组顺序使奇数位于偶数前面

C语言,整数数组转化为字符串