C语⾔字符串输⼊和输出
对字符串做了个简单介绍,若要读取字符串,则⾸先需要分配空间,最简单的办法就是声明数组,如下
char name[20];
C语⾔提供了许多字符串输⼊函数:scanf()、gets()和fgets()等;输出函数:printf()、puts()和fputs()函数等。本⽂主要讲解这部分内容。另外,C++也提供了字符串⾏输⼊函数:getline()和get(),详细可查看。
⽬录
输⼊
scanf()函数
中介绍了scanf()函数,并可利⽤%s转换说明读取字符串。但是,该函数从第1个⾮空⽩字符作为字符串的开始,以下⼀个空⽩字符作为结束。因此,scanf()读取的字符串中不会包含空格,读取的更像是单词。
gets()函数
gets()函数⽤于读取⼀整⾏输⼊,直到遇到换⾏符,并丢弃换⾏符⽽保留其余字符,并在最后添加⼀个空字符使之成为字符串。经常
与puts()函数(下⽂讲述)成对使⽤。例如:
char name[20];
gets(name);
puts(name);
gets()函数⽤于读取整⾏数据(不包括末尾的换⾏符),puts()函数⽤于输出。
但是,gets()函数有⼀个问题。例如在上述代码中,name的⼤⼩为20,⽽输⼊的时候⼤⼩可能会超出这个限制,造成缓冲区溢出,因此它是不安全的。C11标准中已经废除了该函数,但为了兼容以前的代码,有些编译器还是提供了⽀持。
因此,可使⽤fgets()和gets_s()函数替代gets()函数。
fgets()函数
fgets()函数稍微要复杂⼀些,它通过第2个参数对输⼊进⾏限制。假设第2个参数值为n,则fgets()函数将读⼊前n-1个字符,或者遇到第⼀个换⾏符为⽌,但是,该换⾏符也会存储在字符串中,不会被丢弃(注意与gets()函数的区别)。多余的字符将会保留在缓冲区中,作为下⼀次的输⼊。
fgets()函数⼀般⽤来处理⽂件输⼊,因此需要第3个参数指定要读⼊的⽂件。如果是从键盘输⼊,则第3个参数设置为stdin,表⽰标准输⼊。
fgets()函数常与fputs()函数(下⽂讲述)配对使⽤,同样需要给fputs()函数设置参数stdout,表⽰标准输出,例如
char name[20];
fgets(name,20,stdin);
fputs(name,stdout);
fgets()函数返回指向char的指针,返回的地址与第⼀个参数地址相同。如果该函数读到⽂件末尾,则会返回⼀个空指针。
gets_s()函数
C11新增gets_s()函数,该函数与fgets()函数类似,⽤参数限制读⼊的字符数。与fgets()函数不同的是,gets_s()函数只从标准输⼊中读取数据,因此不需要第3个参数,且读取到换⾏符时会直接丢弃⽽不是储存,gets_s()函数与gets()更像。
如果gets_s()函数读到最⼤字符数仍然没有读到换⾏符,则会把⽬标数组中的⾸字符改为空字符,读取并丢弃随后的输⼊,返回空指针,这就需要编写特殊的处理函数。这种情况下,该函数没有fgets()函数⽅便。
综上所述,⽤fgets()函数从键盘输⼊更合适。
输出fgets和fgetc的区别
printf()函数
中介绍了printf()函数,使⽤%s转换说明输出字符串,具体可参见。
puts()函数
在上⽂中已经使⽤了puts()函数,把字符串地址作为参数即可,在遇到空字符串时则停⽌输出。该函数显⽰字符串时会⾃动在末尾添加⼀个换⾏符。
fputs()函数
上⽂中也使⽤了fputs()函数,该函数第2个参数指明要写⼊的⽂件,如果要打印在屏幕上,把第2个参数设置为stdout即可,表⽰标准输出。与puts()函数不同的是,fputs()函数不会在输出末尾添加换⾏符,但可以保留输⼊时字符串中的换⾏符。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论