| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4026 人关注过本帖
标题:关于gets输入和scanf输入的区别
只看楼主 加入收藏
lyxlzp
Rank: 2
等 级:论坛游民
帖 子:61
专家分:38
注 册:2016-10-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
关于gets输入和scanf输入的区别
#include <stdio.h>
#include <string.h>

int main()
{   char a[3][80];
    int yd=0,yx=0,num=0,k=0,q=0,i,j;
    for(i=0;i<3;i++)
       gets(a[i]);    //这里如果用scanf("%s",a[i]); 就无法正常运行!!!!!!![color=#FF0000][/color]
    for(i=0;i<3;i++)
       for(j=0;j<80&&a[i][j]!='\0';j++)
       { if(a[i][j]>='A'&&a[i][j]<='Z')
             yd++;
         else
             if(a[i][j]>='a'&&a[i][j]<='z')
                yx++;
             else
                 if(a[i][j]>=48&&a[i][j]<=57)
                    num++;
                  else
                      if(a[i][j]=' ')
                         k++;
                      else q++;
       }
    printf("大写英文字母有:%d小写英文字母有:%d数字有:%d空格有:%d其他有:%d",yd,yx,num,k,q);
         
    return 0;
}
搜索更多相关主题的帖子: include 
2016-11-26 14:21
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
这个我来解答:
    先离开本题谈谈二者的区别。首先,scanf通常情况下scanf("%s",&a);这样是会吃空格的,也就是说每个scnaf("%s",a)只录入空格(包括\n)之前的内容。但gets(a);是什么都吃。还有,scnaf("%s",a);可以进行格式控制,大体做法是scanf("%[]",&a);"%[]"是进行字符选择(具体可以查有关"%[]"用法的资料)用scnaf也可以输入整个字符串,具体格式是scnaf("%[^\n]%*c");^是非的意思,意思是说吸收所有除了\n之外的字符,当然,遇到\n也把\n吸收进去了。因此为了排除\n的干扰,后面加了]%*c,*的意思是舍去录入该位置的字符。

当然上面一经提到了scanf;一般用法时末尾会把\n保留到stdin流的,当遇到下一个scanf("%c",&ch);时scnaf里面的%c会吃\n。但gets(a);后面会帮你自动补'\0',不会有\n的影响。

第三,二者的返回值不同。scnaf返回的是录入参数列表的成功个数,例如scanf("%s",a);如果录入成功,则返回值为1(因为只有一个参数);但是gets(a);的返回值是返回该字符串的首地址。如果a为字符数组,则:char=*p=gets(a);p的值等价于char *p=a;

你可以结合我所说的,看看这题为什么用scanf("%s",a[i]);无法正常运行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-26 21:34
lyxlzp
Rank: 2
等 级:论坛游民
帖 子:61
专家分:38
注 册:2016-10-20
收藏
得分:0 
回复 2楼 九转星河
。。。 没看懂 大神可以说的通俗点吗?  而且是不是应该是scanf(“%s",a); 不应该加地址符&吧。
  意思是不是 scanf遇到\n的时候停止,而gets是遇到 '\0'或\n 的时候停止呢?

[此贴子已经被作者于2016-11-27 15:46编辑过]

2016-11-27 15:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 lyxlzp
如果a是数组,对于scanf("%s",a);而言,是不用加地址符的。而且,scanf("%s",a),遇到空格就会停止输入,而gets(a);遇到空格还会继续,二者都是遇到\n会停止输入~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-27 16:15
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:10 
scanf 遇到空白符算一组数据(有字符集%[]的看字符集里的条件,按回车开始读取数据。

gets  遇到换行符,即便它是输入的第一个字符,gets也会停止读入并返回。如果输入的第一个字符就是换行符,则字符串将被置为空串。
      由于gets函数读入再丢弃换行符,换行符将不会存储在字符串中。
2016-11-27 16:36
快速回复:关于gets输入和scanf输入的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017743 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved