c - 如何在结构中正确使用 fgets?

标签 c scanf fgets

我无法弄清楚我的代码有什么问题。这是我的代码:

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

#define N 20

typedef struct _dog {
    char dogName[N],ownerName[N];
    int dogAge;
} Dog;

int main() {
    //Dynamic array
    int size;
    printf("Number of dogs: ");
    scanf("%d", &size);
    Dog *dog = (Dog*)malloc(sizeof(Dog)*size);
    printf("\n");
    //Input
    int i;
    printf("Please provide the data: [dogName][ownerName][dogAge] :\n");
    for(i=0;i<size;i++) {
        fgets(dog[i].dogName, sizeof(dog[i].dogName), stdin);
        fgets(dog[i].ownerName, sizeof(dog[i].ownerName), stdin);
        scanf("%d", &dog[i].dogAge);
    }
    //Output
    printf("\nYou provided the following data:\n");
    for(i=0;i<size;i++) {
        printf("Dog Name: %s\nOwner Name: %s\nDog Age: %d\n", dog[i].dogName, dog[i].ownerName, dog[i].dogAge);
    }

    free(dog);
    return 0;
}

任务非常简单,您必须创建一个数据库,但是狗和主人可以有两个或更多名称,所以这就是我尝试使用 fget 的原因。但输出看起来很糟糕:(第一个狗名字部分通常是空白的)

You provided the following data:
Dog Name: 

Owner Name: Doggy 1

Dog Age: 0
Dog Name: Big Dick

Owner Name: 2

Dog Age: 0

我已阅读 this但没有帮助我。

我使用的输入:

Doggy 1
Big Dick
2
Doggy 2

《Doggy 2》之后就结束了。

最佳答案

您将从最后一个 scanf() 中留下一个换行符,这是 fgets()有效输入。改变

scanf("%d", &size);

scanf("%d%*c", &size);

由于输入狗的数量后按ENTER键而消耗并丢弃尾随换行符。

同样的情况也适用于 lop 内部的 dogAge 变量扫描。

相关,引用C11标准,第§7.21.6.2章,fscanf()

Trailing white space (including new-line characters) is left unread unless matched by a directive. [...]

因此,换行符 ('\n')、尾随空白在输入缓冲区中保持未读状态。

关于c - 如何在结构中正确使用 fgets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37238471/

相关文章:

c - 唯一的随机数

c - 为什么我无法接受从零开始的整数输入?

c - 如何使用 "scanf"输入特定字母?

c - 这个 sscanf() 格式字符串有什么问题?

c - 使用 fgets() 和 strtok() 在 C 中逐行读取文件?

c - 如何删除从 C 中的 fgets 输入的额外字符?

c - 双 "for"循环中的 fgets 和 strtok

c - GnuTLS:编译示例代码时出错?

c - Android Studio : include an other path in a c file

c++ - 如果不知道要读取的字符数,如何使用 fgets?