C get()不工作
我正试图使用C get()不工作,c,string,gets,C,String,Gets,我正试图使用gets()从用户那里获取字符串,但程序似乎正在通过gets()。用户无需暂停即可进行输入。为什么get()什么都不做 char name[13]; printf("Profile name: "); gets(name); printf("\n%s", name); 这是因为gets()使用它非常危险,一些C库已经完全删除了它,并将其替换为一个不做任何操作的版本 使用它。这是因为get()使用它非常危险,一些C库已经完全删除了它,并将其替换为一个不做任何操作的版本 请改用。看看
gets()
从用户那里获取字符串,但程序似乎正在通过gets()
。用户无需暂停即可进行输入。为什么get()
什么都不做
char name[13];
printf("Profile name: ");
gets(name);
printf("\n%s", name);
这是因为gets()
使用它非常危险,一些C库已经完全删除了它,并将其替换为一个不做任何操作的版本
使用它。这是因为get()
使用它非常危险,一些C库已经完全删除了它,并将其替换为一个不做任何操作的版本
请改用。看看
从stdin获取字符串
从标准输入(stdin)中读取字符,并将其作为C字符串存储到str中,直到到达换行符或文件结尾
如果找到换行符,则不会将其复制到str中
在复制到str的字符之后,将自动追加终止的空字符
请注意,gets与fgets完全不同:gets不仅使用stdin作为源,而且在结果字符串中不包含结尾的换行符,并且不允许指定str的最大大小(这可能导致缓冲区溢出)
因此,基本上gets()
不仅不安全(可能导致缓冲区溢出),而且读取输入缓冲区中的内容
我建议您使用fgets()
,但如果您想要快速(又懒又笨)的解决方案,只需刷新输入缓冲区即可:
char name[13];
printf("Profile name: ");
fflush(stdin);
gets(name);
printf("\n%s", name);
看看
从stdin获取字符串
从标准输入(stdin)中读取字符,并将其作为C字符串存储到str中,直到到达换行符或文件结尾
如果找到换行符,则不会将其复制到str中
在复制到str的字符之后,将自动追加终止的空字符
请注意,gets与fgets完全不同:gets不仅使用stdin作为源,而且在结果字符串中不包含结尾的换行符,并且不允许指定str的最大大小(这可能导致缓冲区溢出)
因此,基本上gets()
不仅不安全(可能导致缓冲区溢出),而且读取输入缓冲区中的内容
我建议您使用fgets()
,但如果您想要快速(又懒又笨)的解决方案,只需刷新输入缓冲区即可:
char name[13];
printf("Profile name: ");
fflush(stdin);
gets(name);
printf("\n%s", name);
使用
gets()
改为使用fgets()
看到这个问题了吗
fgets()
不起作用的原因可能是您没有处理scanf在以前的语句中留下的换行符
您可以修改scanf格式字符串以将其考虑在内:
scanf(“%d*[^\n]”,&n)代码>
*[^\n]
表示忽略整数输入后不是换行符的所有内容,但不要对换行符执行任何操作(跳过它)
当您使用scanf(“%d”,&num)
时,您点击13,然后enter
,13
存储在num
中,当您从stdin
读取fgets
时,换行符仍在输入缓冲区中,它将\n
视为您输入的数据和fgets()
语句被跳过
您无法刷新输入缓冲区,但可以执行此操作fseek(标准输入,0,搜索结束)
在每个fgets语句之前添加这个使用gets()
改为使用fgets()
看到这个问题了吗
fgets()
不起作用的原因可能是您没有处理scanf在以前的语句中留下的换行符
您可以修改scanf格式字符串以将其考虑在内:
scanf(“%d*[^\n]”,&n)代码>
*[^\n]
表示忽略整数输入后不是换行符的所有内容,但不要对换行符执行任何操作(跳过它)
当您使用scanf(“%d”,&num)
时,您点击13,然后enter
,13
存储在num
中,当您从stdin
读取fgets
时,换行符仍在输入缓冲区中,它将\n
视为您输入的数据和fgets()
语句被跳过
您无法刷新输入缓冲区,但可以执行此操作fseek(标准输入,0,搜索结束)代码>在调用gets()或fgets()之前,在每个fgets语句之前添加此属性。由于stdin中以前的输入中已经存在“\n”,因此将跳过gets()或fgets(),因此调用getchar()将导致跳过自身,而不是gets()或fgets()或任何其他类似函数。但是请记住,它更多的是一种黑客行为,而不是一种标准的解决方案(我想是的),而且使用get()也是被禁止的
printf("\nEnter a String: ");
getchar();
//fgets(inputString, 100, stdin);
gets(inputString);
printf("\n%s", inputString);
在调用gets()或fgets()之前先调用getchar()。由于stdin中以前的输入中已经存在“\n”,因此将跳过gets()或fgets(),因此调用getchar()将导致跳过自身,而不是gets()或fgets()或任何其他类似函数。但是请记住,它更多的是一种黑客行为,而不是一种标准的解决方案(我想是的),而且使用get()也是被禁止的
printf("\nEnter a String: ");
getchar();
//fgets(inputString, 100, stdin);
gets(inputString);
printf("\n%s", inputString);
将下面的函数添加到您的代码中并享受它
string GetString()
{
char ch;
string Line="";
while(1)
{
ch=getchar();
if(ch=='\n')
break;
else
Line+=ch;
}
return Line;
}
此函数也可以影响所有空格和退格 将下面的函数添加到您的代码中并享受它
string GetString()
{
char ch;
string Line="";
while(1)
{
ch=getchar();
if(ch=='\n')
break;
else
Line+=ch;
}
return Line;
}
此函数也可以影响所有空格和退格 使用fflush(标准输入法);在get()之前使用fflush(stdin);gets()@DerekDrummond输入12个字符之前,最后一个字符必须是'\0'
。请使用fgets(name,sizeof name,stdin)
而不是gets()
问题已回答多次,请查看其中一个答案,不要使用scanf
读取字符串。只需使用fgets