c编程:(scanf和gets)
c programming: (scanf and gets)
我知道 scanf() 和 gets() 函数之间的区别在于 scanf() 会继续读取输入字符串,直到遇到空格,而 gets() 会继续读取输入字符串,直到遇到空格\n 或 EOF(文件结尾)。
为了看到这种行为上的差异,我尝试自己编写了一个示例,如下所示:
#include <stdio.h>
int main()
{
char a[20];
printf("enter the string\n");
scanf("%s",&a);
printf("the string is %s\n",a);
char b[20];
printf("enter the string\n");
gets(b);
printf("the string is %s\n",b);
return 0;
}
当变量a被赋予字符串"manchester united"作为输入时,输出是:
enter the string
manchester united
the string is manchester
enter the string
warning: this program uses gets(), which is unsafe.
the string is united
我所期望的输出只是给变量 a 的字符串的第一部分,即曼彻斯特,然后程序提示我为变量 b 输入新的输入字符串。
相反,我得到了上面给出的输出。
根据输出,我的理解是:
可以看出,scanf()一遇到空格,就停止读取后面的字符串,因此,剩下的部分
string:united,已经赋值给变量b,即使程序没有提示我输入变量b的字符串。
如何清除给变量a的字符串的剩余部分(空格后面的部分)?
这样,我就可以为变量 b 输入一个全新的输入字符串。
如能进一步解释代码执行过程中发生的情况,我们将不胜感激。
对最基本的错误表示歉意(从回复中可以看出)!!
只是C编程的新手:)
您可以通过手动读取和丢弃字符来刷新它,直到您找到 '\n'
或有人按下适当的组合键导致 EOF
。或者你可以要求 scanf()
丢弃所有东西直到找到 '\n'
,第二个可以这样实现
char string[20];
scanf("%19s%*[^\n]\n", string);
您的代码还有其他错误的地方
您将 a
声明为 20 char
的数组,然后将其地址传递给 scanf()
,它需要一个 char
的指针,数组名称(变量,如果你喜欢)在必要时自动转换为指向char
的指针。
您使用了 gets()
,它是一个旧的危险且已弃用的函数,不再是标准函数。您应该使用 fgets()
而不是它接受一个参数来防止目标数组溢出。
这是一个测试建议修复的示例
#include <stdio.h>
int
main(void)
{
char string[20];
string[0] = '[=11=]'; /* Avoid Undefined behaviour
when passing it to `fprintf()' */
scanf("%19s%*[^\n]\n", string);
fprintf(stdout, "%s\n", string);
fgets(string, sizeof(string), stdin);
fprintf(stdout, "%s\n", string);
return 0;
}
我知道 scanf() 和 gets() 函数之间的区别在于 scanf() 会继续读取输入字符串,直到遇到空格,而 gets() 会继续读取输入字符串,直到遇到空格\n 或 EOF(文件结尾)。
为了看到这种行为上的差异,我尝试自己编写了一个示例,如下所示:
#include <stdio.h>
int main()
{
char a[20];
printf("enter the string\n");
scanf("%s",&a);
printf("the string is %s\n",a);
char b[20];
printf("enter the string\n");
gets(b);
printf("the string is %s\n",b);
return 0;
}
当变量a被赋予字符串"manchester united"作为输入时,输出是:
enter the string
manchester united
the string is manchester
enter the string
warning: this program uses gets(), which is unsafe.
the string is united
我所期望的输出只是给变量 a 的字符串的第一部分,即曼彻斯特,然后程序提示我为变量 b 输入新的输入字符串。 相反,我得到了上面给出的输出。
根据输出,我的理解是:
可以看出,scanf()一遇到空格,就停止读取后面的字符串,因此,剩下的部分 string:united,已经赋值给变量b,即使程序没有提示我输入变量b的字符串。
如何清除给变量a的字符串的剩余部分(空格后面的部分)?
这样,我就可以为变量 b 输入一个全新的输入字符串。
如能进一步解释代码执行过程中发生的情况,我们将不胜感激。
对最基本的错误表示歉意(从回复中可以看出)!! 只是C编程的新手:)
您可以通过手动读取和丢弃字符来刷新它,直到您找到 '\n'
或有人按下适当的组合键导致 EOF
。或者你可以要求 scanf()
丢弃所有东西直到找到 '\n'
,第二个可以这样实现
char string[20];
scanf("%19s%*[^\n]\n", string);
您的代码还有其他错误的地方
您将
a
声明为 20char
的数组,然后将其地址传递给scanf()
,它需要一个char
的指针,数组名称(变量,如果你喜欢)在必要时自动转换为指向char
的指针。您使用了
gets()
,它是一个旧的危险且已弃用的函数,不再是标准函数。您应该使用fgets()
而不是它接受一个参数来防止目标数组溢出。
这是一个测试建议修复的示例
#include <stdio.h>
int
main(void)
{
char string[20];
string[0] = '[=11=]'; /* Avoid Undefined behaviour
when passing it to `fprintf()' */
scanf("%19s%*[^\n]\n", string);
fprintf(stdout, "%s\n", string);
fgets(string, sizeof(string), stdin);
fprintf(stdout, "%s\n", string);
return 0;
}