程序不';在scanf()之后执行get(),即使使用fflush(stdin)
在花了太多时间搜索为什么我的程序在使用scanf()之后不执行get()之后,我找到了一个解决方案,即在scanf()之后使用fflush(stdin)来启用get()来获取字符串 问题是,fflush(stdin)没有完成预期的功能:程序继续跳过get(),我无法在控制台中编写任何要读取的短语 我的代码是下一个:程序不';在scanf()之后执行get(),即使使用fflush(stdin),c,scanf,gets,fflush,C,Scanf,Gets,Fflush,在花了太多时间搜索为什么我的程序在使用scanf()之后不执行get()之后,我找到了一个解决方案,即在scanf()之后使用fflush(stdin)来启用get()来获取字符串 问题是,fflush(stdin)没有完成预期的功能:程序继续跳过get(),我无法在控制台中编写任何要读取的短语 我的代码是下一个: #include <string.h> #include <stdio.h> int main(){ char nombre[10]; ch
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
printf("Type your name:\n");
scanf("%s", nombre);
fflush(stdin);
printf("Now, type a message:\n");
gets(mensaje);
printf("3/%s:%s",nombre,mensaje);
return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
printf(“键入您的姓名:\n”);
scanf(“%s”,名称);
fflush(stdin);
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“3/%s:%s”,名称,mensaje);
返回0;
}
试试这个:
scanf("%s\n", nombre);
在读取零件时,scanf在空白处停止。获取直到第一个新行为止的读取。所以,scanf会在缓冲区中留下一个换行符,它会立即看到并认为它得到了一个空行
如果您使用原始代码并输入“name message”,两部分都在一行上,您可以看到这一点——gets仍将立即返回,但它将看到第二部分
scanf东西中的\n告诉它也继续使用它。试试这个:
scanf("%s\n", nombre);
在读取零件时,scanf在空白处停止。获取直到第一个新行为止的读取。所以,scanf会在缓冲区中留下一个换行符,它会立即看到并认为它得到了一个空行
如果您使用原始代码并输入“name message”,两部分都在一行上,您可以看到这一点——gets仍将立即返回,但它将看到第二部分
scanf东西中的\n告诉它继续并使用它。Tryget(stdin)代码>而不是
fflush(stdin);
尝试get(stdin)代码>而不是
fflush(stdin);
如果刷新std不起作用,那么按照建议尝试读取额外字符并丢弃
这将有助于:
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
int c;
printf("Type your name:\n");
scanf("%9s", nombre);
while((c= getchar()) != '\n' && c != EOF)
/* discard */ ;
printf("Now, type a message:\n");
gets(mensaje);
printf("%s:%s",nombre,mensaje);
return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
INTC;
printf(“键入您的姓名:\n”);
scanf(“%9s”,名称);
而((c=getchar())!='\n'&&c!=EOF)
/*丢弃*/;
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“%s:%s”,名称,mensaje);
返回0;
}
如果刷新std不起作用,则按照建议尝试读取额外字符并丢弃
这将有助于:
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
int c;
printf("Type your name:\n");
scanf("%9s", nombre);
while((c= getchar()) != '\n' && c != EOF)
/* discard */ ;
printf("Now, type a message:\n");
gets(mensaje);
printf("%s:%s",nombre,mensaje);
return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
INTC;
printf(“键入您的姓名:\n”);
scanf(“%9s”,名称);
而((c=getchar())!='\n'&&c!=EOF)
/*丢弃*/;
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“%s:%s”,名称,mensaje);
返回0;
}
两大主要问题:
不要在输入流上使用fflush
;未定义输入流上的fflush
行为。仅仅因为它在这种情况下起作用并不意味着它是正确的
永不使用获取
-它在C99标准中被弃用,并已从C2011标准中完全删除。它将(而不是may,will)在代码中引入一个主要的故障点
用get
调用跟随scanf
调用从来都不是一个好主意,因为get
不会跳过scanf
在输入流中留下的任何前导换行。使用scanf
读取nombre
和mesaje
printf("Type your name:\n");
scanf("%9s", nombre);
printf("Now, type a message:\n");
scanf("%79s", mensaje);
最好在scanf
调用%s
和%[
中使用显式长度说明符,否则会引入与相同的安全漏洞
编辑
哦。我是个白痴。如果你试图读取包含空格的字符串,你不能使用%s
转换说明符。请改用%[
转换说明符:
scanf( "%79[^\n]", mensage );
这将最多读取79个字符或换行符,以先到者为准,并将换行符保留在输入流中。两个重大问题:
while (fgetc(stdin) != '\n'); // seems to work
不要在输入流上使用fflush
;未定义输入流上的fflush
行为。仅因为它在这种情况下工作并不意味着它是正确的
永不使用get
-它在C99标准中被弃用,并已从C2011标准中完全删除。它将(不可能,将)在代码中引入一个主要故障点
用get
调用跟随scanf
调用从来都不是一个好主意,因为get
不会跳过scanf
在输入流中留下的任何前导换行。使用scanf
阅读nombre
和mesaje
printf("Type your name:\n");
scanf("%9s", nombre);
printf("Now, type a message:\n");
scanf("%79s", mensaje);
最好在scanf
调用%s
和%[
中使用显式长度说明符,否则会引入与相同的安全漏洞
编辑
哦。我是个白痴。如果你试图读取包含空格的字符串,你不能使用%s
转换说明符。请改用%[
转换说明符:
scanf( "%79[^\n]", mensage );
这将最多读取79个字符或换行符,以先到者为准,并将换行符保留在输入流中。请阅读:(与您的问题无关)。可能重复将最后一个printf
更改为printf(“3/%s:%s\n”,nombre,mensaje)它运行不好,因为当程序到达那一行时,消息(mensaje)必须被写入,而我无法写入任何内容,因为get()一直在跳过donfflush(stdin)
。
while (fgetc(stdin) != '\n'); // seems to work