C语言getchar()和gets()的用法:
1、gets读一行,getchar()读一个字符。
2、函数用法:
1)gets()用于从标准输入流stdin读入一个整行(以'\n'或EOF)结束,写入ptr指向的字符数组,并返回这个指针;出错或遇到文件结束时则返回NULL。行末的'\n'从流中取出,但不写入数组。gets()不检查被写入的数组大小。
2)getchar()用于从标准输入流stdin读入一个字符,并返回这个字符。如果读到文件结尾,则返回EOF。注意到EOF不能用char类型表示,所以getchar()函数返回的是一个int型的数。使用时也应该注意这一点。
:
getchar是读入函数的一种。它从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。
C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
参考资料:
百度百科——getchar
百度百科——gets
百度百科——C语言
//大概是这样的
char gets(char string)
{
int i;
for(i=0;string[i]!='\n';i++)
string[i] = getchar();
return string;
}
注意这点,gets()函数会读取一行字符,直到遇到换行符'\n为止,并且这个换行符不会读取到数组中。
scanf("%s%s",a1,a2);
这一行把aa和bb读取并分别保存到a1和a2数组中,但是会把回车符留在缓冲区中。
gets(a3);gets(a4);
这里的gets(a3)会读取这个回车符,但是不会把回车符保存到a3数组,所以a3数组内容不会改变,接下来的gets(a4)将以回车结尾的cc
dd读取并保存到a4中
puts(a1);puts(a2);
分别在单独的行中输出a1和a2字符串。
puts(a3);puts(a4);
分别在单独的行中输出a3和a4字符串。由于a3没有赋值,所以它依然保持在定义时的随机值。
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用gets()已经发生了溢出!这是gets()不检查数据边界的bug造成的。
另外,“字符串不是总是以'\0'作为串的结束符”,答案是肯定的,不然puts()函数就不能在合适的地方停下来了。这里st[15]被gets()函数赋值为'\0'。这里要说明的是st[15],st[16]是存在而不合法的,因为字符串实际上就等同于指针,类似st[16]是实在的地址但是是不应该被引用的。
为什么这里溢出没有产生错误?可能系统分配内存是以一个最小的大小整段整段的分配(这个我只是猜测)。你可以试着输入的字符串变长一点,就可以看到内存读写出错的提示了,这就是溢出的严重后果!我在DOS系统下测试字符串长了直接当机。
验证1:st[15]被赋值为'\0'
#include"stdioh"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
验证2:
#include"stdioh"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同样的建议:拒绝gets(),这本来就是一个有bug的函数!
scanf(
)函数和gets(
)函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi
hello",则应该使用__gets__函数。
gets可以接收空格;而scanf遇到空格、回车和
Tab键
都会认为输入结束,所有它不能接收空格。
char
string[15];
gets(string);
/遇到回车认为输入结束/
scanf("%s",string);
/遇到空格认为输入结束/
所以在输入的字符串中包含空格时,应该使用gets输入。
scanf和gets获取字符串时的区别
在C语言中,能构获取字符串的函数至少有两个:
1scanf()
所在
头文件
:stdioh
语法:scanf("格式控制字符串",变量地址列表);
接受字符串时:scanf("%s",
字符数组名
或指针);
2gets()
所在
头文件
:stdioh
语法:gets(字符数组名或指针);
两者在接受字符串时:
1不同点:
scanf不能接受空格、
制表符
Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
2相同点:
字符串接受结束后自动加'\0'。
例1:
#include
<stdioh>
main()
{
char
ch1[10],
ch2
[10];
scanf("%s",ch1);
gets(ch2);
}
依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd
fg\0"。
例2:
#include
<stdioh>
main()
{
char
ch1[10],ch2[10],c1,c2;
scanf("%s",ch1);
c1=getchar();
gets(ch2);
c2=getchar();
}
依次键入asdfg回车,asdfg回车,则ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需输入。
scanf
:当遇到回车,空格和
tab键
会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受
回车键
之前输入的所有字符,并用'\n'替代
'\0'回车键不会留在输入缓冲区中
gets()用到读取字符串,用回车结束输入
scanf()可以读取所有类型的变量
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。gets(s);读取字符串时,首字符存放在s[0]中,接着依次存放在s[1],s[2],……中。读取到回车符时,将空字符'\0'存入s数组中,作为字符串结尾符。用此函数时,必须保证s数组足够大。你的程序将字符串读入s中后,再统计其中每个数字字符的多少,最后,输出s中从0到9各数字字符出现的个数。
二者都是从终端读入字符串。功能为
1、 gets功能为读入一行,并将换行符转换为字符串结束符。
2、 scanf("%s",s);读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入。
从功能上可以看出不同之处:
1 终止条件不同。gets只有遇到\n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入。
比如输入"test string\n"。
用gets得到的字符串为"test string", 二用scanf得到的是"test"。
2 终止后,对终止字符处理不同。
比如输入为"test\nabcd"。
执行gets后,\n不会留在缓冲区中,即这时调用getchar得到的字符是'a'。
执行scanf后,\n会留在缓冲区,这时调用getchar得到的字符是'\n'。
以上就是关于C语言getchar()和gets()的用法全部的内容,包括:C语言getchar()和gets()的用法、C语言中 gets()函数的原型是、C语言中gets函数能否只接收一个换行符 如gets(a),输入时输入回车等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!