最近在写一个测试的小程序,由于用到了sscanf函数对字符串进行标准读入,而sscanf在很多方面都与scanf比较相像,于是对scanf进行了一番测试,遇到了一系列基础性的问题,恶补基础的同时也体现了自己的薄弱。
话不多说,直接附上问题吧。
问题描述
#include<stdio.h>
#include<string.h>
int main()
{
while(1)
{
char str[256]={0};
int a=0;
char b=' ';
printf("please input the num:
");
scanf("%[^,],%[^,],%d",str,&b,&a);
printf("input is str: %s b: %c a: %d And str length is %u, the first character is %u
",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=' ';
printf("please input the num:
");
scanf("%*[
]%[^,],%[^,],%d",str,&b,&a);
printf("input is str: %s b: %c a: %d And str length is %u, the first character is %u
",str,b,a,strlen(str),str[0]);
//gets(str);
}
return 0;
}
本来目的是过滤输入的回车,其中%*是过滤满足条件的字符,但是如果直接输入"a,a,0",也会出现不需要输入然后不断地循环输出的现象。
问题解答
scanf里面的任何%都至少要匹配1个字节,所以连续两个逗号是匹配不出任何东西的。注意这里,哪怕是%*...都是只要要匹配一个字符的,匹配不了的就是失败。而死循环的原因,是因为流里面一个字节都没有被接受,所以每次循环面对一摸一样的流。scanf每次都失败。
示例:
1 #include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 while(1) 7 { 8 char str[256]={0}; 9 int a=-1; 10 char b='
