最近在写一个测试的小程序,由于用到了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='