C语言字符串输入和输出

字符串一文对字符串做了个简单介绍,若要读取字符串,则首先需要分配空间,最简单的办法就是声明数组,如下

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()函数不会在输出末尾添加换行符,但可以保留输入时字符串中的换行符。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值