| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1857 人关注过本帖
标题:scanf("%s",字符串)和gets(字符串)的区别??内附程序断
只看楼主 加入收藏
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
结帖率:91.67%
收藏
已结贴  问题点数:2 回复次数:6 
scanf("%s",字符串)和gets(字符串)的区别??内附程序断
scanf("%s",字符串)和gets(字符串)有区别吗?
我认为是没有的,可是我写了下面的程序才发现不对头
程序的目的是为了给N个首选人选票,最后打印出每个候选人名字下有几票,共M个投票人
程序段1:
#include<stdio.h>
#include<string.h>
#define N 3  /*3个候选人*/
#define M 10   /*10个投票者*/
struct person
{
    char name[10];
    int count;
};
main()
{
    struct person ps[N];
    int i,j;
    char vote_name[10];

    /*初始化候选人*/
    printf("请输入候选人名单,每输入一人回车结束:\n");
    for(i=0 ; i<N ; i++)
        scanf("%s",ps[i].name);
    for(i=0 ; i<N ; i++)
        ps[i].count=0;

    /*唱票*/
    printf("请输入您要投票的名字:\n");
    for(i=0 ; i<M ; i++)
    {
        gets(vote_name);    /*这句是关键,用scanf("%s",vote_name);取代会有不同效果*/
        for(j=0 ; j<N ; j++)
            if( strcmp(ps[j].name,vote_name)==0 )
                ps[j].count++;
    }

    /*输出结果*/
    for(i=0 ; i<N ; i++)
        printf("%s:%d\n",ps[i].name,ps[i].count);

}
这个程序只输入9个投票人,就输出结果了,但是
 gets(vote_name);    /*这句是关键,用scanf("%s",vote_name);取代会有不同效果*/
换掉后


程序段2:
#include<stdio.h>
#include<string.h>
#define N 3  /*3个候选人*/
#define M 10   /*10个投票者*/
struct person
{
    char name[10];
    int count;
};
main()
{
    struct person ps[N];
    int i,j;
    char vote_name[10];

    /*初始化候选人*/
    printf("请输入候选人名单,每输入一人回车结束:\n");
    for(i=0 ; i<N ; i++)
        scanf("%s",ps[i].name);
    for(i=0 ; i<N ; i++)
        ps[i].count=0;

    /*唱票*/
    printf("请输入您要投票的名字:\n");
    for(i=0 ; i<M ; i++)
    {
        scanf("%s",vote_name);      /*这句是关键,用gets(vote_name); 取代会有不同效果*/
        for(j=0 ; j<N ; j++)
            if( strcmp(ps[j].name,vote_name)==0 )
                ps[j].count++;
    }

    /*输出结果*/
    for(i=0 ; i<N ; i++)
        printf("%s:%d\n",ps[i].name,ps[i].count);

}
则没问题,输入10人投票后才输入结果



请人解释一下原因,谢谢大大们
搜索更多相关主题的帖子: gets scanf 内附 字符 
2010-07-21 18:44
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
收藏
得分:0 
求解释!
2010-07-21 19:16
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
收藏
得分:0 
求解释
2010-07-21 20:22
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
scanf()语句不允许在输入中存在空白字符(也就是在scanf()语句中不能打空格。)
给你举个例子吧:
当用scanf()接收字符串时,键入“Pan Wei Bo”后,只有“Pan”会被存储在内存中,而空格字符后的其他剩余字符将被丢弃。为了克服这个问题就要使用gets()函数,来用于输入字符串。
总之概为1句话:scanf()用于接收字符,而gets()用于接收字符串

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-21 20:24
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:1 
gets主要是用于输入一个字符串,与数组一起搭配。
比如:char a[50]; gets(a);这样就可以连续输入小于或等50个字符了。

而scanf通常只能输入一个变量,而且它会与一些格式字符一起使用。
比如:char ch; int b; scanf("%c,%d",&ch,&b);  

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-21 20:24
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:1 
这样的问题我之前也遇到过,问题产生的原因在于用scanf存入数据的时候,他会忽略数据之前的空格以及回车符。
程序中,你在初始化候选人的时候输入了三个字符串,当输入最后一个字符串的时候,内存中留下了你最后输入的那个换行符'\n'.
如果你在后面存数据的时候还是使用scanf,那么他会忽略这个换行符'\n',所以不会有任何的影响。
而gets就不一样了,他只要遇到换行符就认为输入结束了,所以这个留在内存里的换行符就被当成了一个输入。
这就是为什么scanf得到的结果正确,gets会少一个输入的原因。
2010-07-21 20:28
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
收藏
得分:0 
多谢楼上的,我明白了
谢谢
2010-07-21 20:44
快速回复:scanf("%s",字符串)和gets(字符串)的区别??内附程序断
数据加载中...
 
   



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

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