首页 新闻 会员 周边

请教一个有关C语言scanf过滤字符串的问题

0
悬赏园豆:50 [已解决问题] 解决于 2017-11-20 14:17
#include<stdio.h>
#include<string.h>

int main()
{
        while(1)
        {
                char str[256]={0};
                int a=0;
                char b='\0';
                printf("please input the num:\n");
                scanf("%[^,],%[^,],%d",str,&b,&a);
                printf("input is str: %s  b: %c  a: %d And str length is %u, the first character is %u\n",str,b,a,strlen(str),str[0]);
                //gets(str);
        }
        return 0;
}

在这段代码里,如果我初始输入"a,a,0",输出正确。但输入",,0"的话,接下来会自动不需要输入然后循环着不断的输出,想问一下这个是什么原因。还有一个是我将代码改成了如下:

#include<stdio.h>
#include<string.h>

int main()
{
        while(1)
        {
                char str[256]={0};
                int a=0;
                char b='\0';
                printf("please input the num:\n");
                scanf("%*[\n\r\t]%[^,],%[^,],%d",str,&b,&a);
                printf("input is str: %s  b: %c  a: %d And str length is %u, the first character is %u\n",str,b,a,strlen(str),str[0]);
                //gets(str);
        }
        return 0;
}

本来目的是过滤输入的回车,但是如果直接输入"a,a,0",也会出现不需要输入然后不断地循环输出的现象。也想问一下为什么。希望大佬们帮忙解答一下这个基础问题,谢谢。

问题补充:

我是在linux环境上直接用gcc编译的,windows可以用fflush过滤回车换行符

Boblim的主页 Boblim | 菜鸟二级 | 园豆:492
提问于:2017-11-16 11:46
< >
分享
最佳答案
0

哎,难道C语言真的淘汰了吗?这么个问题居然三天没有人回答。scanf里面的任何%都至少要匹配1个字节,所以连续两个逗号是匹配不出任何东西的。注意这里,哪怕是%*...都是只要要匹配一个字符的,匹配不了的就是失败

所以我建议你的程序应该改成fgets获得一行之后再sscanf

 

收获园豆:50
窗户 | 小虾三级 |园豆:886 | 2017-11-19 20:47

您好,听到您说的我专门拿程序试了一下,想问一下那为什么我在第一个代码里输入,a,0的话是可以的呢,按您说得%必须匹配一个字节,而对于这个输入的话字符串是没有匹配任何字节的。谢谢您帮忙解答一下啊

Boblim | 园豆:492 (菜鸟二级) | 2017-11-20 08:44

@Boblim: 

,a,0应该是识别不出来的,会进入死循环

窗户 | 园豆:886 (小虾三级) | 2017-11-20 10:08

@窗户: 您好,还想问一下这个一直处于死循环的原因是什么,是因为标准缓冲区里有数据但是不符合匹配值所以不需要输入么

Boblim | 园豆:492 (菜鸟二级) | 2017-11-20 11:26

@Boblim: 因为流里面一个字节都没有被接受,所以每次循环面对一摸一样的流。scanf每次都失败。

窗户 | 园豆:886 (小虾三级) | 2017-11-20 13:22

@窗户: 谢谢你了啊,我了解了

Boblim | 园豆:492 (菜鸟二级) | 2017-11-20 14:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册