C语言使用输入字符串函数时的问题
C语言使用输入函数gets(),fgets(),scanf()时出现了一些问题。
今天在学习字符数组时遇到这样一个问题,输入以下代码:
char t[10];
gets(t);
printf("%s\n",t);
在vc++2010编译器编译后输入:
Abcdefgh←
Abcdefgh
结果没有问题。注意输入字符数不能大于等于10个,因为末尾有一个隐藏的\0符号,如果输入10个字符或更多就会导致溢出报错。
但是,在linux中用gcc编译器编译时会报错,提示说gets是不安全的函数,已经被废弃。查了一下,可以用fgets代替。所以改成:
char t[10];
fgets(t,10,stdin);
printf("%s\n",t);
此时,再次编译后输入:
Abcdefgh←
Abcdefgh
为什么会多一行空行呢?因为fgets()和gets()函数有区别:
gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。
**fgets函数原型:**char *fgets(char *s, int n, FILE *stream);// 我们平时可以这么使用:fgets(str, sizeof(str),
stdin);其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据。
fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完N-1个字符,或者读完一行。 注意:调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加’\0’,并以str作为函数值返回。
可以看出fgets()函数的末尾系统会自动在最后加上一个\0符号,并且会读入换行符“\n”。而gets()函数不会读入\n而是将\n转换成\0。因此,使用fgets()时,如果输入字符数小于定义数组的字符数-1时,会多打印一行空行。注意,在上面的程序中,如果输入10个字符,fgets()只会读前9个字符,并且最后加上\0,此时字符数组t长度是10并且输出时不换行;但是如果输入8个字符,则读入了8个字符+“\n”+“\0”共10个字符。此时,输出时会多输出一行换行。
第二个问题:
我加入了scanf函数,和gets函数一起用时:
char t[10],y[10];
scanf("%s",t);
gets(y);
printf("t=%s\n",t);
printf("y=%s\n",y);
如果输入:
abcdefgh←
t=abcdefgh
y=
可以发现甚至都没有来得及输入y就已经出来结果了。这是因为在使用scanf()函数时,输入完字符后,要按一下回车键。原本输入的字符都存储在缓存区中,在按下回车键后便被读取到变量中。但是在按下回车后多余了一个回车符,正好被下面的gets()函数读取了,导致直接跳过了下一个变量的输入。这里可以用getchar()函数来吸收掉多余的回车符,使程序正常运行。
引用请注明出处:http://www.sgyh.xyz/archives/76.html
已有 2 条评论
发表新评论
- 上一篇: C程序设计(第五版) 第五章 知识总结
- 下一篇: 汉诺塔问题
怎么收藏这篇文章?
haowenzhang