字符串函数
作者:互联网
如果想把一个字符输入进程序,首先必须预留足够的空间,然后用输入函数获取该字符串。
关于空间的分配,可以直接声明数组的大小,还可以使用C库函数来动态分配,之后会详细介绍,为字符串分配内存后,便可读入字符串,C库提供了许多读取字符串的函数:scanf()、gets()和fgets()。
一、字符串的输入
1、gets()
用于读取一整行的字符:会读取整行输入,直到遇到换行符,丢弃换行符并存储以读取字符,并在其末尾添加一个空字符使其成为字符串。通常和puts配合使用。
不过此函数有一个问题,他不能确定存储字符串的变量能否装得下输入的字符,如果输入的字符过长,会导致缓冲区溢出:多余的字符超出了指定的目标空间。有很大可能导致程序异常终止。所以这种致命缺点使人们放弃了他,不过在一些特定场合,这依然是一个很方便的函数。
2、fgets()和fputs()
fgets()函数通过2个参数限制读入的字符数来解决溢出问题,与gets()的区别:
1、fgets()的第二个参数指明了读入字符的最大数量,如果为n,则最多读入n-1个字符,或者遇到第一个换行符为止。
2、不会丢弃换行符。
3、fgets()的第三个参数指明要读取的文件,如果是读取冲键盘输入的数据,则以stdin为参数。
此函数与fputs()配合使用,fputs()的第二个参数,如果要显示在显示器上,则为stdout。
puts()函数会在字符串末尾加上换行符,fputs()不会。
fgets()函数返回char的指针,如果进行顺利,该函数返回的地址与传入的第一个参数地址相同。但是读到文件尾时,它将返回一个空指针,该指针保证不会指向有效的数据,所以可用于标记这种特种情况。在代码中用0代替,不过在C语言中用宏NULL代替,例子:读入并显示用户输入的内容,直到fgets()读到文件结尾或者换行符
这里我们SLEN设置的5,输入的字符超出范围但依旧显示了出来:fgets()一次读入SLEN - 1个字符并储存,fputs()打印,然后while循环进入下一轮迭代,直到返回空或者换行符,并因为\n将光标移到下一行开始处。
系统使用缓冲的I/O。这意味着用户按下Return键之前,输入的数组都被暂存在临时存储器(即:缓冲区)中,按下Return键就在输入中加入一个换行符,并把整行输入发送给fgets()。对于输出,fputs()把综费发送给另一个缓冲区,发送换行符时,缓冲区中的内容被发送至屏幕上。
fgets()存储换行符的优点:对于存储的字符串,检查末尾是否有换行符判断是否读取了一整行;坏处是:在字符串中的换行符会带来一些麻烦
如何处理字符串中的换行符:
在字符串中查找后替换成空字符:
其次,如果输入行中还有字符串怎么办?如果目标数组装不下一整行输入,就丢弃多余的字符:
例子:读取输入行,删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符串,因为该字符串已经被处理过,所以输出函数使用puts()。
3、scanf()
有其基础用法,在此不多说。scanf()与gets()和fgets()一样,都是字符串输入函数,它们之间的区别是对于字符串的判断:后两者根据空字符或换行符来判断字符是否为串;前者根据空白字符(空格、空行、制表符、换行符等)作为字符串的结束,空白字符不算入字符串中,可以指定字段宽度,如%10s,这样scanf()只能读取10个字节或第一个空白字符,可以用此特性防止数据溢出。
还会返回一个整合值,表示读取是否成功。
由上图可知,读取输入行遇到空格便会停止读取,用fgets()输入数据跟合适。如果一次只输入一个单词,用它也没问题。
二、字符串的输出
1、puts()
puts()只需要把字符串的地址传递给它就可以了,在显示字符串的时候在末尾添加一个换行符。注:双引号括起来的内容是字符串字面量,也可以被视为字符串的地址;
puts()如何知道何时停止?遇到空字符停止。
2、fputs()
fputs()是puts对文件定制的版本。区别如下:
- fputs()的第二个参数是文件的地址指针,如果要输出到控制台,则为“stdout”;
- 不会在末尾添加换行符
关键注意,puts与gets()配合使用,fputs与fgets()配合使用。
标签:函数,fputs,fgets,字符串,换行符,输入,读取 来源: https://www.cnblogs.com/xingyboy/p/16374815.html