繁体   English   中英

fgets()的第一个实例被跳过

[英]fgets()'s first instance is being skipped

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

for(g = 0;g<numStudents;g++)
  {
    array->firstName = malloc(sizeof(char)*BUFSIZE);
    array->lastName = malloc(sizeof(char)*BUFSIZE);

    printf("Student %d\n", g+1);
    printf("First Name:");
    fgets(array->firstName, BUFSIZE, stdin);
    printf("Last Name:");
    fgets(array->lastName, BUFSIZE, stdin);
    printf("\n\n");
  }

我在本节之前使用scanf(),所以我发现必须刷新缓冲区。 但是,这是行不通的。

输出通常为:

Student 0
First Name:Last Name:(Cursor)

您必须小心混合使用不同的输入法,例如scanffgets 如果您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;
}

如果您编译/运行该代码,请输入123 456 ,您将看到的输出是:

123[ 456
]

在那里,您可以看到fgets拾取了扫描的整数之后的其余行,从第一个非数字空格到最后的换行符。

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

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

但是,最简单的方法也许是使用定制的,经过验证的行输入函数来获取行,然后对这些行进行sscanf以获取所需的内容,例如本例

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM