| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1193 人关注过本帖
标题:scanf 接受包括空格在内字符串出现了问题
只看楼主 加入收藏
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
结帖率:96.15%
收藏
已结贴  问题点数:20 回复次数:12 
scanf 接受包括空格在内字符串出现了问题
由于需要接受包括空格在内的字符串数据,所以在网上搜了下资料,看到了用scanf("%[^\n]",input);来接受的,结果发现运行程序会直接跳过这个语句不执行,也不能说不执行,而是不会等待你输入就结果继续运行下面的程序了,求解释!!!!
搜索更多相关主题的帖子: 问题 数据 运行程序 字符串 资料 
2012-04-20 00:22
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
顺便说一下,由于gets   会出现漏洞问题,所以不到万不得已不想用

清风拂暮(木)
2012-04-20 00:24
davidlv419
Rank: 2
等 级:论坛游民
帖 子:24
专家分:69
注 册:2009-4-30
收藏
得分:0 
回复 楼主 清风拂晓
为什么不用fgets()呢
2012-04-20 16:05
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
就你这水平连菜鸟都不如。

愿用余生致力编程
2012-04-20 17:24
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
fgets会存在连换行符号的读进去的情况

清风拂暮(木)
2012-04-20 17:36
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:20 
以下是引用清风拂晓在2012-4-20 00:22:01的发言:
结果发现运行程序会直接跳过这个语句不执行,也不能说不执行,而是不会等待你输入就结果继续运行下面的程序了,求解释!!!!


你的输入流中有残留的字符。在scanf()之前先 fflush(stdio)。

/*------------------------*/
#include <stdio.h>
#include <string.h>
#define SIZE 11

int main(void)
{
    char s[SIZE];
    puts("Enter a string:");
    scanf("%10[^\n]", s);     // 读取一行,但只把前10个存入字符串s
    printf("String: %s, Length: %d\n", s, strlen(s));
    fflush(stdio);            // 丢弃字符流中余下的字符
    return 0;
}

—>〉Sun〈<—
2012-04-20 17:40
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
使用scanf()是很麻烦的。
还要留意scanf()函数中格式化字符串的数值。

—>〉Sun〈<—
2012-04-20 17:43
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
清除输入缓冲的残留字符应该是fflush(stdin) 不是stdio 吧
还有我这里是一个循环输入的,用每次循环先用fflush,在接受输入字符,但是还是一样,
另外fgets  对之前循环之外的输入,用了fflush  但他还是会接受到之前残留下来的换行符号,不知道为什么

贴上一小部分我的代码吧,比较直观
程序代码:
  printf("please input your name,note:your name lenth not over 20 byte\n");
    scanf("%s",clientName);
    if(send(sd,&clientName,strlen(clientName),0)<0)
    {
       perror("send");
       exit(1);
    }
    if(pthread_create(&pd,NULL,(void *)dellMsgFromServer,sd)!=0)
    {
       perror("pthread_create");
       exit(1);
    }
    while(1)
    {
       fflush(stdio);
       fgets(input,1024,stdin);
       if(send(sd,&input,strlen(input),0)<0)
       {
          perror("send");
          exit(1);
       }

我这是写聊天室的部分代码,那个线程用来接受并处理服务器发送来的信息

清风拂暮(木)
2012-04-20 17:55
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
确实是 stdin 非常抱歉,失误

—>〉Sun〈<—
2012-04-20 17:59
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
fflush(stdin);

—>〉Sun〈<—
2012-04-20 18:04
快速回复:scanf 接受包括空格在内字符串出现了问题
数据加载中...
 
   



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

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