字符串一文对字符串做了个简单介绍,若要读取字符串,则首先需要分配空间,最简单的办法就是声明数组,如下
char name[20];
C语言提供了许多字符串输入函数:scanf()
、gets()
和fgets()
等;输出函数:printf()
、puts()
和fputs()
函数等。本文主要讲解这部分内容。
另外,C++也提供了字符串行输入函数:getline()
和get()
,详细可戳此链接查看。
输入
scanf()函数
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()
函数从键盘输入更合适。
输出
printf()函数
printf()一文中介绍了printf()
函数,使用%s
转换说明输出字符串,具体可参见此文。
puts()函数
在上文中已经使用了puts()
函数,把字符串地址作为参数即可,在遇到空字符串时则停止输出。该函数显示字符串时会自动在末尾添加一个换行符。
fputs()函数
上文中也使用了fputs()
函数,该函数第2个参数指明要写入的文件,如果要打印在屏幕上,把第2个参数设置为stdout
即可,表示标准输出。与puts()
函数不同的是,fputs()
函数不会在输出末尾添加换行符,但可以保留输入时字符串中的换行符。