C fgets()';正在跳过的第一个实例

C fgets()';正在跳过的第一个实例,c,input,fgets,C,Input,Fgets,所以我在练习c,在使用fgets()时遇到了这个错误。代码的第一个实例被跳过并转到下一行 代码 您必须小心混合不同的输入方法,如scanf和fgets。如果您scanf(“%d”)并输入一个整数,后跟一个换行符,指针将留在换行符处(第一个字符对于构造整数无效),因此正如您所见,这就是后面的fgets将拾取的内容 例如,考虑下面的小程序: #include <stdio.h> int main (void) { int val; char buffer[100];

所以我在练习c,在使用fgets()时遇到了这个错误。代码的第一个实例被跳过并转到下一行

代码


您必须小心混合不同的输入方法,如
scanf
fgets
。如果您
scanf(“%d”)
并输入一个整数,后跟一个换行符,指针将留在换行符处(第一个字符对于构造整数无效),因此正如您所见,这就是后面的
fgets
将拾取的内容

例如,考虑下面的小程序:

#include <stdio.h>
int main (void) {
    int val;
    char buffer[100];
    scanf ("%d", &val);
    fgets (buffer, sizeof(buffer), stdin);
    printf ("%d[%s]\n", val, buffer);
    return 0;
}
在这里,您可以看到,
fgets
已拾取扫描整数后的行的其余部分,从第一个非数字空间到末尾的换行符

如果单独使用
scanf
,通常是可以的,因为大多数(但不是全部)格式说明符在读取项目之前都会跳过前导空格

还有一些方法可以混合使用不同的输入法,例如在
scanf
之后读取字符,直到得到一个换行符,从而有效地丢弃该行的其余部分(包括换行符)

但也许最简单的方法是使用定制的、经过验证的行输入函数来获取行,然后
sscanf
这些行来获取您想要的内容,例如


这样,所有输入都是基于行的,您仍然可以使用
scanf
从行中提取数据。

您必须小心混合不同的输入方法,如
scanf
fgets
。如果您
scanf(“%d”)
并输入一个整数,后跟一个换行符,指针将留在换行符处(第一个字符对于构造整数无效),因此正如您所见,这就是后面的
fgets
将拾取的内容

例如,考虑下面的小程序:

#include <stdio.h>
int main (void) {
    int val;
    char buffer[100];
    scanf ("%d", &val);
    fgets (buffer, sizeof(buffer), stdin);
    printf ("%d[%s]\n", val, buffer);
    return 0;
}
在这里,您可以看到,
fgets
已拾取扫描整数后的行的其余部分,从第一个非数字空间到末尾的换行符

如果单独使用
scanf
,通常是可以的,因为大多数(但不是全部)格式说明符在读取项目之前都会跳过前导空格

还有一些方法可以混合使用不同的输入法,例如在
scanf
之后读取字符,直到得到一个换行符,从而有效地丢弃该行的其余部分(包括换行符)

但也许最简单的方法是使用定制的、经过验证的行输入函数来获取行,然后
sscanf
这些行来获取您想要的内容,例如


这样,所有输入都是基于行的,您仍然可以使用
scanf
从行中提取数据。

sizeof(char)==1
并且是必需的,您可以发布您的输入吗?另外,对于固定大小使用
malloc()
也不是很必要。至少,答案适用于您的情况。
scanf()
可能会在输入流中留下一个换行符,
fgets()
读取为第一个输入“行”。我会将此作为副本关闭,但我希望在使用Mjolnir之前达成一些共识。在
scanf
之后如何刷新缓冲区?使用
while((int c=getchar())!='\n'&&c!=EOF)在循环之前。
sizeof(char)==1
是必需的,您可以发布您的输入吗?另外,对于固定大小使用
malloc()
也不是很必要。至少,答案适用于您的情况。
scanf()
可能会在输入流中留下一个换行符,
fgets()
读取为第一个输入“行”。我会将此作为副本关闭,但我希望在使用Mjolnir之前达成一些共识。在
scanf
之后如何刷新缓冲区?使用
while((int c=getchar())!='\n'&&c!=EOF)在循环之前。
#include <stdio.h>
int main (void) {
    int val;
    char buffer[100];
    scanf ("%d", &val);
    fgets (buffer, sizeof(buffer), stdin);
    printf ("%d[%s]\n", val, buffer);
    return 0;
}
123[ 456
]