关于gets函数 gets函数的定义

2024-04-02 00:19:14 综合百科 投稿:LE
最佳答案gets函数,可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。gets是从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容

关于gets函数

1

gets函数,可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。gets是从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

误用gets()函数的一个问题

2

C语言面试经常会考如下一道题,哪里有错误:

#include stdio.h int main() { char string[100] = {''}; gets(string); printf("输入的字符串是:%s n", string); return 0; }

这段C程序可能有问题,问题就在于函数gets()的使用。

gets从标准输入设备读字符串函数,可以无限读取,不会判断上限,以回车结束读取。所以如果输入的字符串超过100个,它也不会做检测,此时就会发生溢出。

可以使用fgets函数来从文件中读取字符串。fgtes函数原型是

char *fgets(char *buf, int bufsize, FILE *stream);

一般的教材都会对这个函数的用法作出解释,这里就不在详述了,以下文字摘用百度百科的解释:百度百科对fgets的解释

从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋''),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

C语言常用的输入输出函数

3

C语言的基本单位是语句,每条语句都是用来向计算机发送操作指令,但有时需要程序在运行过程中,需要用户自己手动输入数据,并且得到运行结果,那么这时输入输出函数就起到了作用。下面一一介绍C语言提供的各种输入输出函数,至于文件的输入输出函数在这里暂不做讨论,以后将会介绍。

一、putchar函数:

putchar(int ch)函数是字符输出函数,其作用是向终端输出一个字符,等同于printf("%c",ch),函数的定义形式为:int putchar(int ch),其参数可以是字符型变量、整形变量或常量,如输出一个字符putchar('s')。该函数若输出正确,则返回输出字符的无符号整形数值,如果输出错误则返回EOF。

二、getchar()函数:

字符数据输入可使用getchar函数(不带参数),当然了有时也可以使用getch函数和getche函数,但是有所区别,下面会介绍它们之间的区别,其作用可以从输入缓存区中顺序读取一个字符。

测试程序只写出主要代码:

char s,m;

s=getchar();

putchar(s); ①

m=getchar(); ②

putchar(m);

上面代码在输入完一个字符后(如'g'),由于需要确定输入结束需要按回车键确定,所以当把字符g赋给s后,字符回车便被送入到内存缓存区中,上面说到该函数会从缓存区中读取字符,因此第二个会直接从缓存区中读走回车符,因此m就被赋予回车这个字符,这往往跟当初的设定的结果不一样,因此需要在一和二之间加一句getchar();以便取走回车符,这样才可以继续给m赋值。

三、getch()函数、getche函数跟getchar函数的区别:

①、所处的库函数不同,getchar是stdio.h中的函数,而getch跟getche是则是conio.h中的函数。

②、getch和getche函数是直接从键盘上读取函数,它们没有缓存区,缓存区有没有字符跟它们无关,而getchar则不同,上面讲过。

③、getche和getchar你输入的字符会在屏幕上显示出来,而getch则不带回显,你输入的字符不会显示在屏幕上。

④、getch和getche这两个函数,不需要用按回车完成输入,你输入一个字符会立刻被读取,并不需要其他键(如回车)来确定完成输入,而getchar函数需要使用回车键确定完成输入。

四、字符串输出函数int puts(char *p)函数:

puts函数向终端输出一个字符串,也可以说将一个字符串放到标准输出流中。其参数是字符指针类型,也可以是字符串常量,输出一行字符串后会自动进行换行操作。如果输出正确则返回输出字符串的长度,如错误则返回0。

puts函数会在字符串中判断''结束标志,一旦遇到那么即使后面还有字符串也不会输出,如puts("abcdefg"),输出结果abcd,并且自动换行。

五、字符串输入函数char *gets(char *p):

gets()函数从标准输入设备读取一个字符串,直到接受到换行或者EOF时结束,并且将读取的结果放到指针指向的字符数组当中,这里有一个问题,就是gets函数可以无限的读取,并不会判断上线,一旦超出字符数组的长度,程序将会将会崩溃,所以在使用此函数时应当注意。还有此函数如果读取成功,则返回指针p,否则返回NULL。

六、格式输出函数printf函数:

printf函数也成为格式输出函数,其作用是向终端输出任意类型的数据,其一般形式为printf(格式控制,输出列表)。

参数说明:

①、格式控制是由双引号括起来的字符串,其中的字符串包含两部分,一种是格式字符,另一种是普通字符,普通字符也就是按原样输出的字符,重点就是格式字符,格式字符是以%开头,用来进行格式说明,将输出的数据转化为指定的格式。

下面介绍几种格式字符:

d、i:以带符号的十进制形式输出。

o:以无符号八进制形式输出。

x、X:以无符号十六进制形式输出,二者区别是前者a~f以小写形式输出,后者以大写形式输出。

u:以无符号十进制形式输出。

c:以字符形式输出一个字符。

s:输出字符串。

f:以小数形式输出。

e、E:以指数形式输出实数,区别是用e表示指数以e表示,后面以E表示。

g、G:选用%f或%e格式中宽度较短的一种,不输出无意义的0。

如果在输出实数是%.nf时指精确到n位。

当字符格式为%ns时,表示输出字符占n列,如果字符长度小于n,那么输出的字符处在n列的最右侧,左边剩下的空格补齐。如果字符串长度大于n,则全部输出。

当字符格式为%-ns时,正好跟上面相反,输出的字符在n列的最左侧,右边以空格补齐。

当输出字符串是%n.ms格式时,指输出占n列,只取字符串左端的m个字符,并且这m个字符处在n列的右侧,左边以空格补齐,如果m>n,则m个字符全部输出。如:char *str=love;printf("%6.3s",str),结果为

lov,注意前面有三空格,可能不太明显。

如果%-n.ms格式时,区别是这m个字符,处在n列的左侧。上面的例子,结果为,lov ,注意后面有三空格,总共占用6列。

七、scanf函数:

scanf函数成为格式输入函数,即按指定格式将数据输入到指定变量当中。

其一般格式为scanf(格式控制,地址列表),与printf函数不同的是,printf第二个参数为变量名列表,而scanf为变量的地址列表。如&a,b就代表变量a,b的地址,为取址运算符,所以a也是表达式,求变量a的地址。

scanf函数本身本身不能显示提示字符串,顾在需要提示时需要用printf函数。

scanf函数使用的格式控制符:

d、i:输入带符号的十进制数。

o:输入无符号八进制数。

x、X:输入无符号十六进制数,无论大小写。

u:输入无符号十进制数。

c:输入单个字符。

s:输入字符串。

f:输入实型,小数形式指数形式均可。

e、E、g、G:与f作用相同,不论大小写。

*符:表示指定的输入项在读入后不赋给相应的变量。

如scanf("%d%*d",a,b);执行后变量b将得不到输入值。

也可以在格式控制符中加入正数,如scanf("%3d",a),那么当输入1234时,只截取123赋给变量a。但是不能加入实数,不能指定输入精度,如scanf("%3.2f",a),这是非法的。

附加格式说明符表:

l/L:输入一个长整型数据。(%ld %lo)。

h:输入短整型数据。(%hd,%ho)。

n:用于指定输入数据所占的宽度,上面以有所介绍。

*:前面以介绍过。

输入时间隔符:

①、空白字符:scanf函数在读操作中会略去一个或多个空格符,直到第一个非空白符出现为止,如scanf("%d%d",a,b),用户可以在输入时输入任意多的空格,如: 6 8,都不影响scanf函数获取,scanf函数会忽略这些空格。空白字符可以是空格、tab、newline等。

②、空白字符:非空白字符会使scanf函数在读入时剔除掉与这些非空白字符相同的字符。如scanf("%d,.,%d",a,b),输入6,.,8,或6 , . , 8等,那么之间的,.,将会被忽略,但是在用户输入时必须带上,.,,而且只能在中间,否则会出错。

但当输入字符使用%c,空格跟转义均为有效字符,如scanf("%c%c",a,b),输入s空格m,那么就会出现问题,字符s赋给a,但是并不是字符m赋给b,而是空格赋给b,m字符将被忽略。这一点要注意。

在输入字符串时,如果字符串中有空格,那么当scanf函数检测到第一个空格时,就结束读取。如scanf("%s",str(数组名不需要加取址运算符)),当输入i love you时,它只把i赋给str后面就忽略了。但是此时的缓存区中还有love you,此时如果使用getchar()函数就可以读取到剩余的字符,当然了也可以继续使用scanf函数。

运用scanf函数时一定要想到缓存区,比如,有两条输入语句scanf("%d",a);scanf("%c",%b);那么在输入第一条语句后,由于需要回车确认结束,那么当第一个数据被赋予变量a以后,回车进入了缓存区,所以下一个输入语句不需要再输入,scanf函数直接就将回车符赋给变量b,所以就出现了错误,回车就赋给了变量b。解决这问题很简单,只要在两条语句中加一句getchar()即可,也可以使用fflush(stdin)即可。

其实运用scanf函数并不难,只要想到缓存区即可。

至此文章暂时介绍到这里,下一篇在继续。

WwW.BaiKeZhishi.Com
标签: 函数 gets
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:baikezhishi@foxmail.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!