【发布时间】:2014-10-03 01:31:48
【问题描述】:
我看过各种帖子,说明如何在 fgets 之前使用 scanf 可能会导致问题。但是,我认为为什么在 AFTER 之后添加它会导致第一个语句中断。
这就是我所拥有的:
unsigned char key;
unsigned char message[100];
printf(" Please input a message \n ");
fgets(message, MAX_BUF, stdin);
printf("Your message is: %s \n", message);
// Read user input for message
printf(" Please input a numeric key\n ");
scanf("%d", &key);
printf("Your message is: %s \n", message);
printf("strlen(message) = %d \n", strlen(message));
这是一次“试运行”:
Please input a message
hello
Your message is: hello
Please input a numeric key
123
Your message is:
strlen(message) = 0
像这样,无论输入如何,消息变量最终都是空的。但是,如果我用 scanf 注释掉该行,一切正常(除了我无法分配键)。
救命!
【问题讨论】:
-
只在程序中稍后运行的代码应该不可能及时返回并更改之前的输出。因此,请使用您问题上的 EDIT 按钮提供"Minimal, Complete, Verifiable Example"。没有它,就不可能确切知道您的定义是什么或可能导致您看到的问题的原因。
-
报告
fgets()和scanf()的返回值以帮助理解问题至关重要。显示您的输入会有所帮助。 -
感谢 cmets,这是我在 Stack Overflow 上的第一个问题,因此对于帖子的不完整深表歉意。我已经编辑了它,希望它现在很好。
-
@HostileFork 未定义的行为可能导致时间旅行。 (虽然在这段代码中不需要时间旅行,因为虚假输出直到 UB 之后才会出现)
-
@MattMcNabb 嗯。我现在看到了一个可能未开发的电影剧本领域。 “宇宙是一台巨大的计算机,如果你违反规则,宇宙编译器可以随意对事件进行重新排序。Michael J Fox 和 Christopher LLoyd 在《回到未来 IV:未定义的行为》中回归” (也许宇宙规范说 87 mph 是 DeLorean 应该走的最快速度?)