gpt4 book ai didi

c gets/fgets 不工作

转载 作者:行者123 更新时间:2023-11-30 18:38:06 25 4
gpt4 key购买 nike

gets 在函数 neuePerson 中不起作用,它在 for 循环中时有效,但后来我更改了它,现在编译器说不是未定义的。

我用fgets尝试过,现在没有警告,但它仍然忽略fgets,所以我无法在控制台中写入任何内容。

main函数的gets中起作用。我有点困惑...:o

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "readline.h"

//typedef struct Person {
// char name[50];
// char unit;
// int number;
//} Person;

typedef struct person {
char name[50];
char unit;
int number;
struct person *next;
} Person;

void neuePerson(Person *firstPerson) {
time_t t;
time(&t);
srand((unsigned int)t);
while (firstPerson->next != 0)
firstPerson = firstPerson->next;
printf("Gib einen Namen ein \n");
fgets(firstPerson->name, 50, stdin);
firstPerson->number = rand() % 99 + 1;
firstPerson->unit = rand() % 3 + 65;
firstPerson->next = (Person*)malloc(sizeof(Person));
firstPerson = firstPerson->next;
firstPerson->next = 0;
}

void ausgabe(Person *anfang) {
while (anfang->next != 0) {
printf("Name: %s", anfang->name);
printf(" Abteilung: %c", anfang->unit);
printf(" Tel.Nummer: %i\n", anfang->number);
anfang = anfang->next;
}
}

int main() {
Person* pers1 = (Person*)malloc(sizeof(Person));
//Person* test = (Person*)malloc(sizeof(Person));
//gets(test->name, 50);
//printf("%s", test->name);
pers1->next = 0;
char z = 'n';
while (z != 'e') {
printf("[n]eue Person, [a]usgabe, [e]nde");
z = getchar();
if (z == 'n') neuePerson(pers1);
else if (z == 'a') ausgabe(pers1);
}
}

最佳答案

问题来自于标准输入的行缓冲:

您使用 getchar() 读取 main 中的选项,但在您键入 Enter 键后该字节将返回到您的程序。仅返回该行中的初始字符,其余字符保留在流中。

当您随后使用 fgets() 读取此人的姓名时,它会返回一个空行,因为它获取仍在流中的 \n。与普遍看法相反,fflush(stdin)不是解决方案,因为它具有未定义的行为。更好的解决方案是这样读取选项:

int main() {
Person *pers1 = (Person*)malloc(sizeof(Person));
pers1->next = NULL;
pers1->unit = 0;
pers1->name[0] = '\0';
for (;;) {
int z, c;
printf("[n]eue Person, [a]usgabe, [e]nde ");
z = c = getchar();
while (c != EOF && c != '\n')
c = getchar();
if (z == EOF || z == 'e')
break;
else
if (z == 'n')
neuePerson(pers1);
else
if (z == 'a')
ausgabe(pers1);
}
}

您应该改进列表处理:空列表应该只是NULL,在列表末尾保留一个未初始化的虚拟结构是不正确的。您可以通过将指向头的指针传递给 neuePerson 来处理对列表头的更新。

关于c gets/fgets 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com