【发布时间】:2016-01-04 20:29:22
【问题描述】:
我在 Visual Studio 2015 中编写了以下程序-
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
#pragma warning(disable : 4996)
{
char name[40];
printf("What's your name? ");
scanf("%s", name);
fflush(stdin);
printf("Hello, %s. %s\n", name, PRAISE);
getchar();
getchar();
getchar();
getchar();
return 0;
}
程序在所有情况下都运行良好。但是当我提供“Shabbir”、“Shabbir K”和“Shabbir Kh”作为输入时,控制台窗口保持打开状态。如果我提供“Shabbir Kha”作为输入,控制台窗口将不会保持打开状态。
如您所见,控制台窗口保持打开状态,直到第二个单词达到三个字符长度。如果第二个单词长度为三个或更多字符,则它不会保持打开状态。
相同的程序在 Code Blocks 13.12 中没有显示任何问题。
【问题讨论】:
-
不要打电话给
fflush(stdin)——一般情况下是UB。 -
当调用 scanf(), 1) 在 %s 上放置一个大小修饰符,即
scanf("%39s", name);所以用户不能溢出输入缓冲区。对 40 字节的 name[] 数组使用 39,因为 scanf() 在字符串输入上附加了一个 NUL 字符。 2)始终检查返回值(不是参数值)以确保操作成功。 -
谢谢你,@PaulR。我不知道这是未定义的行为。我们的讲师教我们使用
fflush(stdin)来防止不需要的用户输入扰乱我们的程序。您能否建议一种更便携的方式来完成同样的工作? -
@ShabbirKhan:没有简单、方便和可移植的方法 - 但在某些情况下,您可以使用以下 user3629249 的方法。如果您想阅读此主题,StackOverflow 上也有很多很好的相关问题和答案。
-
@PaulR:好的,谢谢!我会这样做的。
标签: c windows console visual-studio-2015 windows-console