Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C get()不工作_C_String_Gets - Fatal编程技术网

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