【问题标题】:Getting a line of user input in C help.在 C 帮助中获取一行用户输入。
【发布时间】:2011-05-02 22:11:13
【问题描述】:

我已经在网上四处寻找并尝试了很多不同的东西,但它们似乎从来没有奏效。每次我运行程序时,它都会跳过输入学生姓名的机会,直接进入系。此外,我们是 C 新手,确实被告知要使用 printf 和 scanf,但是当用户输入像 joe shmo 这样的名称时,它会做一些奇怪的事情。

fputs("Please enter the students name: ", stdout);
fflush(stdout);
fgets(studentArray[empty].name, sizeof studentArray[empty].name, stdin);

printf("\nPlease enter the students department: ");
scanf("%s", studentArray[empty].department);
printf("\nPlease enter the students rank: ");
scanf("%d", &studentArray[empty].rank);

编辑:奇怪的东西,如果我输入两个名称,即 joe shmo,它将以 joe 作为名称并自动将 shmo 添加到部门。 studentArray 是我制作的结构体数组...

typedef struct {
char name[MAX_NAME_LENGTH];
char department[MAX_DEPT_LENGTH];
int rank;
} student;

【问题讨论】:

  • 请定义“奇怪的东西”。另外,请提供studentArray的定义。
  • 在此之前有没有你没有显示的代码?
  • 尽量不要混用scanf()fgets()——首选fgets(),然后解析输入。

标签: c


【解决方案1】:

当程序到达fgets() 时,我敢打赌,输入缓冲区中有一个来自前一个scanf() 的待处理'\n'。我建议你去掉那个 '\n' 和任何以前的输入。

例如,用

int getridofextrainput(void) {
  int ch;
  while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
  return ch;
}

然后在您认为有必要的代码中使用该函数(在fgets 之前)。

【讨论】:

  • 可能想在该函数中添加ungetc
  • @anatolyg:为什么? ???!?!基本上我想摆脱缓冲区中的最后一个'\n',这是读取的最后一个字符。我为什么要把我不想要的角色放回去?
【解决方案2】:

当您混合使用 fscanffgets 时会发生这种情况。

fscanf 读取一个数字时,它会停在这个数字的末尾,后面的换行符之前。之后fgets 读取一个字符串时,它会停在下一个换行符处,不幸的是,它紧随其后。

如果您只使用fscanf 读取所有数据,您不会遇到问题。这不是微不足道的,因为您的某些名称包含空格。使用fscanf 可以读取包含空格的名称,如下所示:

scanf("%[^\n]", studentArray[empty].department);

如果您只使用fgets 读取所有数据,您也可以。不幸的是,这也不是微不足道的:它需要一个临时缓冲区来读取数字。

char temp[42];
fgets(temp, sizeof temp, stdin);
sscanf(temp, "%d", &studentArray[empty].rank);

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2011-12-18
    • 2019-12-08
    相关资源
    最近更新 更多