scanf(),printf()和gets(),puts()在输入输出字符串时的区别

本文详细解析了C语言中输入函数scanf与gets的区别,及输出函数printf与puts的不同之处。重点介绍了它们对于空格和回车符的处理方式,以及如何避免输入缓冲区遗留问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.scanf("%s",str)和gets(str)

scanf("%s",str)和gets(str)均可用于输入字符串到字符数组变量str,但scanf("%s",str)匹配连续的一串非空白字符,遇到空格、tab或回车即结束,字符串前的空白字符没有存入str,只表示输入还未开始(感谢garbageMan的指正),而gets(str)读到回车处结束,所以当句子中单词由空格分开时要用后者来输入,如下图所示:


需要强调一点,scanf("%s",str)在遇到'\n'(回车)或' '(空格)时输入结束,但'\n'(回车)或' '(空格)停留在出入缓冲区,如处理不慎会影响下面的输入;gets(str)遇到'\n'(回车)时输入结束,但'\n'(回车)已被替换为'\0',存储于字符串中,输入缓冲中没有遗留的'\n'(回车),不会影响后续的输入。测试程序的代码为:

[html]  view plain copy print ?
  1. #include<iostream>  
  2. #include<stdio.h>  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.   //freopen("//home//jack//jack.txt","r",stdin);  
  9.   char str[80];  
  10.   char ch;  
  11.   cout<<"1、请输入一个没有空格的字符串:"<<endl;  
  12.   scanf("%s",str);  
  13.   cout<<"用scanf(\"%s\",str)输入的字符串为:"<<str<<endl;  
  14.   cout<<"再输入一次作为对比:"<<endl;  
  15.   while((ch=getchar())!='\n'&&ch!=EOF);  
  16.   gets(str);  
  17.   cout<<"用gets(str)输入的字符串为:"<<str<<endl;  
  18.   cout<<"2、请输入一个有空格的字符串:"<<endl;  
  19.   scanf("%s",str);  
  20.   cout<<"用scanf(\"%s\",str)输入的字符串为:"<<str<<endl;  
  21.   cout<<"再输入一次作为对比:"<<endl;  
  22.   while((ch=getchar())!='\n'&&ch!=EOF);  
  23.   gets(str);  
  24.   cout<<"用gets(str)输入的字符串为:"<<str<<endl;  
  25.   return 0;  
  26. }  


其中while((ch=getchar())!='\n'&&ch!=EOF);是处理输入缓存中的遗留的办法;fflush(stdin)方法对某些编译器不适用,不是标准C支持的函数。

2、printf(“%s”,str)和puts(str)

先看如下代码:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. #include<stdio.h>  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.   //freopen("//home//jack//jack.txt","r",stdin);  
  9.   char str1[80]="hello";  
  10.   cout<<"用printf(\"%s\",str1)输出的字符串为:";  
  11.   printf("%s",str1);  
  12.   cout<<"用puts(str1)输出的字符串为: ";  
  13.   puts(str1);  
  14.   char str2[80]="hello world";  
  15.   cout<<"用printf(\"%s\",str2)输出的字符串为: ";  
  16.   printf("%s",str2);  
  17.   cout<<"用puts(str2)输出的字符串为: ";  
  18.   puts(str2);  
  19.   return 0;  
  20. }  



从运行结果可以看出,printf(“%s”,str)和puts(str)均是输出到'\0'结束,遇到空格不停,puts(str)会在结尾输出'\n',printf(“%s”,str)不会换行。printf(“%s\n”,str)可以替换puts(str)

完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值