字符串输入/输出函数对比

字符串输入函数包括gets()、fgets()、gets_s(),在读入字符串时,这四个函数又各有其特点。如下:

首先,在读取字符串时,一般情况都先定义一个字符数组来储存所读取的字符串,例如:

char words[80];

gets(words);

1.gets()函数:当输入字符串时候,gets()函数读取整行,直至遇到换行符\n。当读到换行符的时候,结束读取,并且丢弃换行符,并在这些字符的末尾添加一个\0让字符组成字符串,而其相对应的puts()输出函数在打印字符串时,会自动在结尾加上一个换行符\n。但是gets()却有一个问题,当gets()读取的字符串过长时,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间(即字符数组),如果这些字符只是占用了没有使用的内存,就不会有问题,可万一占用了已经在使用的内存,那么不好的结果可能就会发生。

2.fgets()函数:fgets()函数有三个参数,第一个表示储存的数组,第二个参数表示读入字符串长度,如果该长度是n,那么fgets()函数就会读取n-1个字符或者读到换行符为止(因为最后一个字符要放\0),当fgets()函数读取到换行符时,会将该换行符保存起来,由于fgets()在读取到换行符时就停止读取,因此此时的字符串结尾是\n\0。而fgets()函数的第三个参数表示要读入的文件,如果是从键盘输入,则用标准输入当做参数(stdin)。

3.gets_s()函数:gets_s()相当于gets()的升级版,只有两个参数,用其中一个参数来限制读入字符的数量,另外一个参数表示存入的数组,由于gets_s()只从stdin中读取输入,因此不需要第三个参数。和fgets()函数不同的是,当gets_s()读取到换行符\n时,会直接丢弃换行符,而不是储存起来。

但是却只有两个输出函数puts()、fputs(),分别对应gets()和fgets()。

1.puts()函数:puts()的参数即为一个数组名,其实就是一个字符的地址,从该地址出发,一直打印字符串直到遇到空字符(\0)时停止输出,因此在用puts()输出时,必须要使输出的语句带有空字符。且puts()在输出时,会自动在输出完后添加一个换行符\n,与gets()读取时丢弃换行符相对应。

2.fputs()函数:该函数在输出时需要两个参数,首先是要输出的数组名,即为第一个字符的地址,第二个参数则为要写入数据的文件,如果要在屏幕上显示输出,则直接填上标准输出(stdout)即可。与puts()不同的是,fputs()在输出时,不会在字符串末尾添加换行符。而与fputs()相对应的fgets()在读取到换行符时,会在字符串的末尾加上一个换行符,因此在fputs()输出时,根据情况,还是会输出换行符。因此fputs()与fgets()配对使用。

猜你喜欢

转载自blog.csdn.net/o707191418/article/details/81459816