以下是引用清尘J在2013-2-19 17:56:34的发言:
#include
#include
int main(){
char str[1000];
int len,temp;
int i,j;
int n;
scanf("%d",&n);
for(i=0;i
做如下修改就可以了:#include<stdio.h>
#include<string.h>
int main(){
char str[1000];
int len,temp;
int i,j;
int n;
scanf("%d",&n);
fflush(stdin);
for(i=0;i<n;i++){
memset(str,'\0',sizeof(str));
temp=0;
gets(str);
//
scanf("%s",str);
len=strlen(str);
for(j=0;j<len;j++){
if(str[j]>='0'&&str[j]<='9')
temp++;
}
printf("%d\n",temp);
}
return 0;
}
我猜想原因是:执行完scanf("%d",&n);之后缓冲区会存在一个某个字符,被后面的gets得到了
网上查资料得到:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
而gets读入以任何字符开始的字符串,但之后会丢弃换行符并以'\0'代替;
所以gets读到的是回车符,可以在gets后,打印下就知道了,
为了验证这个想法,代码做了如下修改:
#include<stdio.h>
#include<string.h>
int main(){
char str[1000];
int len,temp;
int i,j;
int n;
scanf("%d",&n);
//
fflush(stdin);
for(i=0;i<n;i++){
memset(str,
'*',sizeof(str)); //注意*的ascii值为42
temp=0;
gets(str);
printf("%s,%d,%d\n", str,str[0],str[1]);//打印str[0]和str[1]的ascii值
//
scanf("%s",str);
len=strlen(str);
for(j=0;j<len;j++){
if(str[j]>='0'&&str[j]<='9')
temp++;
}
}
return 0;
}
但是打印的结果为 str为空,str[0]为0,str[1]为42(*的ascii值)
由此可知
str[0]得到一个ascii值为0 的字符 即null
这个字符给gets取到了,而scanf是取不到的。
此结论就推翻了我刚才的想法,囧!!
求大牛们分析下,我觉得可以从gets和scanf的源码上分析就一目了然了。