字符串输入与输出

1.gets( )函数(和puts())

gets( )函数简单易用,它读取整行输入,直至遇到换行符,然后丢掉换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为字符串。它经常和puts( )函数配对使用,该函数用于显示字符串,并在这些字符的末尾添加换行符。

但是,gets( )函数只知道数组的开始处,并不知道数组中有多少个元素。如果输入的字符串过长,会导致缓冲区溢出,即多余的字符超出了指定的目标空间。如果多余的字符只是占用了未被使用的内存,就不会立即出现问题;如果他们擦写掉程序中的其他数据,会导致程序异常终止,或者还有其他情况。所以很多人都在建议抛弃gets( )函数。

gets( )的替代品gets_s( ),它是stdio.h输入输出函数系列中的可选扩展,所以支撑C11的编译器也不一定支撑它。

 

2.fgets( )函数(和fputs( ))

fgets()函数通过第二个参数限制读入的字符数来解决溢出的问题。该函数专门设计用于处理文件输入,所以一般情况可能不太好用。fgets()和fgets()的区别如下。

  • fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数数的值是N,那么fgets()将读入N-1个字符,或者遇到第一个换行符为止。
  • 如果fgets()读到一个换行符,会把它存储在字符串中。这点与gets()不同,gets()会丢弃掉换行符。
  • fgets()函数的第3个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识定义在stdio.h中。

注意:fgets()函数返回指向char的指针。如果一切顺利的话,该函数返回的地址与传入的第1个参数相同。但是,如果函数读到文件结尾,它将返回一个特殊的指针:空指针。该指针保证不会指向有效的数据,所以可用于标识这种特殊情况。在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替更常见。

#include <stdio.h>
int main()
{
  char word[10];
  while(fgets(word,10,stdin)!=NULL&&word[0]!='\n')
    fputs(word,stdout);
}

如以上代码,虽然fgets只读入9个字符,但是该程序似乎在处理过长的输入时完全没有问题。

系统使用缓冲的I/O。这意味着用户在按下Return键之前,输入都被存储在临时存储区(缓冲区)中。按下Return键就在输入中增加一个换行键,并把整行输入发送给fgets()。对于输入,fputs()把字符发送给另一个缓冲区,但发送换行符时,缓冲区中的内容被发送至屏幕上。

 

2.gets_s函数

gets_s()与fgets()的区别如下

  • gets_s()只从标准输入中读取数据,所以不需要第3个参数。
  • 如果gets_s()读到换行符,会丢弃它而不是存储它。
  • 如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着调用依赖实现的“处理函数”(或者你选择的其他函数),可能会终止或退出程序。

 

3.puts()

  • puts()函数很容易使用,只需把字符串的地址作为参数转递给它即可。
  • puts()在显示字符串时会自动在末尾添加一个换行符。
  • puts()再遇到空字符时停止输出,所以必须确保有空字符。

4.fputs()

fputs()函数是puts()针对文件定制的版本,他们的区别如下。

  • fputs()函数的第2个参数指明要写入数据的文件。如果要打印在显示器上,可以用定义在stdio.h中的stdout作为参数。
  • 与puts()不同,fputs()不会在输出的末尾添加换行符。

 

提醒:

char *word;
while(*word)     //与*word!='\0'相同

if(word)        //与word!=NULL相同,NULL即读到文件结尾或出现读取错误
posted @   Godofball  阅读(491)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示