3

我正在为 C 编程课程做一个最终项目。该项目是创建一个数据库来存储药物信息。我已经完成了所有元素,现在可以微调所有内容了。

项目中有一个需求是用户可以更改药品信息的功能。在要求中,用户应该能够通过按回车键跳过一个字段。例如,用户可以更改药品的生产商和数量。如果用户不想更改生产者,他们会按 Enter 键并移动到数量上。

我环顾了互联网,并且能够让用户跳过为生产者输入字符串。但是,我不能让它与整数一起工作。

这是我使用的,以便用户可以跳过输入字符串:

scanf("%30[^\n]", fentry[found].producer);

为清楚起见, fentry.producer 是一个包含 30 个字符的字符串,并且 found 是一个整数变量。

我试过用整数输入做类似的事情(编辑:整数输入,我的意思是输入数量,而不是“找到”变量)。它会让你跳过输入一些东西,但如果你确实输入了一些东西,它会存储一个随机值。

有人知道该怎么做吗?

4

5 回答 5

3

与使用相比scanf(),从用户那里获得交互式输入的更好方法是使用fgets(). 此函数获取直到用户按下 Enter 的完整输入行,并返回它以便您可以解析它。

然后,如果您愿意,您可以使用它sscanf()来读取信息。sscanf()工作原理几乎完全一样,scanf()只是它从字符串而不是标准输入中读取数据。

于 2011-08-07T22:39:00.100 回答
0

那这个呢?

char s[50];
fgets(s, 50, stdin);

if(s[0] != '\n') {
    fentry[found].producer = atoi(s);
}

您必须从 s 中删除所有空格。

于 2011-08-07T22:38:38.417 回答
0

您是否在 scanf 之前将整数初始化为 0?

于 2011-08-07T23:00:38.117 回答
0
scanf("%29s", fentry[found].producer); while('\n'!=getchar());

这完全有效,严格符合 ANSI C,最大。便携的。输入缓冲区已清除,支持 chararray-length,chararray 包含(终止)'\0'(不需要初始化),并且您的数组从不包含来自用户输入的 '\n'。

于 2011-08-08T06:37:09.027 回答
0

我怀疑键盘缓冲区导致您的代码出现问题。第一次调用代码时,它将读取最多 30 个字符 - 只要它们不是 NEWLINE 字符。他们将在阅读 NEWLINE 时终止。NEWLINE 将保留在缓冲区中。

但是...如果您再次以相同的方式调用 scanf,则上一次调用的 NEWLINE 仍将位于键盘缓冲区中。这将在从键盘请求更多输入之前读取。NEWLINE 将立即使 scanf 模式失败,char 数组将不会被更新,并且您将被留给指向未初始化内存区域的 char 指针。

于 2011-08-08T10:31:48.330 回答