我经常看到人们不鼓励其他人使用scanf并说有更好的选择。但是,我最终看到的只是“不要使用scanf”或“这里是正确的格式字符串”,并且从来没有提到“更好的替代方案”的任何示例。
例如,让我们看一下这段代码:
scanf("%c", &c);
Run Code Online (Sandbox Code Playgroud)
这将读取最后一次转换后留在输入流中的空白。通常建议的解决方案是使用:
scanf(" %c", &c);
Run Code Online (Sandbox Code Playgroud)
还是不使用scanf。
由于scanf不好,用于转换scanf通常无需使用即可处理的输入格式(例如整数,浮点数和字符串)的ANSI C选项有哪些scanf?
我有以下程序:
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d",&a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%c",&c1); // line 3
printf("Enter another char: ");
scanf("%c", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如我在C书中读到的那样,作者说scanf()在缓冲区中留下了一个新的行字符,因此,程序不会在第4行停止供用户输入数据,而是将新行字符存储在c2中并移至第5行.
是对的吗?
但是,这只发生在char数据类型中吗?因为我没有int在第1,2,3行中看到数据类型的这个问题.是不是?
因此,谷歌快速搜索fflush(stdin)清除输入缓冲区会发现许多网站警告不要使用它.然而,这正是我的CS教授教授课程的原因.
使用有多糟糕fflush(stdin)?即使我的教授正在使用它并且似乎完美无缺地工作,我是否真的应该放弃使用它?
我想知道它的缺点scanf().
在许多站点中,我已经读过使用scanf可能导致缓冲区溢出.这是什么原因?还有其他缺点scanf吗?
我已经找到了while((c = getchar()) != '\n' && c != EOF)在这里使用清除stdin 几次的例子,并尝试在通过fgets获取输入的循环中使用它.我需要刷新,因为循环从最后一个输入获取\n字符并再次运行它.
那么现在发生的是我现在必须按两次输入.为什么会发生这种情况,我该如何解决这个问题呢?
#define BUFFER_LIMIT 50
do
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
printf("console> ");
fgets(input_buffer, BUFFER_LIMIT-1, stdin);
if(do_something(input_buffer))
break;
} while(strncmp(input_buffer, "quit", 4) != 0);
Run Code Online (Sandbox Code Playgroud) 基本上,我需要确保输入是一个整数,如下所示:
do {
printf("Enter > ");
scanf("%d", &integer);
} while (/* user entered a char instead of an int */);
Run Code Online (Sandbox Code Playgroud)
我尝试了各种方法,但是当我尝试输入时,它总是以运行时错误或无限循环结束char.我知道这fflush(stdin)是一个未定义的行为,最好不要将它包含在我的代码中以防止任何错误加上它由于某些原因在VS2015中不再起作用.
下面的代码是我尝试过的方法:
typedef enum {false, true} bool;
int ipt;
char c;
bool wrong_ipt;
do {
c = '\0';
printf("Enter > ");
scanf("%d%c", &ipt, &c); //infinite loop occurs while a char has been entered
} while (c != '\n');
do {
c = '\0';
printf("Enter > ");
} while (scanf("%d", &ipt) …Run Code Online (Sandbox Code Playgroud) 有人可以就 scanf 提出建议吗?“message”是一个 4 行 x 16 列的数组。用户输入数字(全部为 1 位整数)后,按“Enter”键时会出现错误消息。正如所说 - 可能与 scanf 有关。
for (int i = 0; i < M; i++) {
for (int j = 0; j < columns; j++) {
scanf("%d", message[i][j]);
}
}
Run Code Online (Sandbox Code Playgroud)