#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过滤回车换行符
哎,难道C语言真的淘汰了吗?这么个问题居然三天没有人回答。scanf里面的任何%都至少要匹配1个字节,所以连续两个逗号是匹配不出任何东西的。注意这里,哪怕是%*...都是只要要匹配一个字符的,匹配不了的就是失败
所以我建议你的程序应该改成fgets获得一行之后再sscanf
您好,听到您说的我专门拿程序试了一下,想问一下那为什么我在第一个代码里输入,a,0的话是可以的呢,按您说得%必须匹配一个字节,而对于这个输入的话字符串是没有匹配任何字节的。谢谢您帮忙解答一下啊
@Boblim:
,a,0应该是识别不出来的,会进入死循环
@窗户: 您好,还想问一下这个一直处于死循环的原因是什么,是因为标准缓冲区里有数据但是不符合匹配值所以不需要输入么
@Boblim: 因为流里面一个字节都没有被接受,所以每次循环面对一摸一样的流。scanf每次都失败。
@窗户: 谢谢你了啊,我了解了