sscanf()如何查看字符串中的数字?

时间:2013-01-22 22:49:43

标签: c scanf

我在以下代码中遇到了sscanf()的问题:

void num_check(const char*ps){
char *ps1=NULL;
int number=0;
unsigned sum_num=0;
ps1=ps;

for(;*ps1!='\0';ps1++){
    if (isdigit(*ps1)){
      sscanf(ps1,"%d",&number);
      sum_num+=number;
    }
    }
printf("Sum of digits is: %d",sum_num);


}


int main(){

printf("Enter a string:\n");
char str[20];
gets(str);
num_check(str);
return 0;
}

问题是:当我以“w2b4e”的形式输入一个字符串时,它总结了我的数字,我得到了理想的结果。但是当我尝试输入诸如“w23b4e”之类的字符串时,它的作用是:它在循环中看到数字23,因此变量number=23和s um_num=23,但是下一步是循环是:number=3sum_num=26。并在下一步sum_num= 30 ... 这让我很困惑。既然我不相信sscanf()有这样一个古怪的缺陷,我做错了什么?

4 个答案:

答案 0 :(得分:5)

你总是在循环中前进一个字符:ps1++。您可能希望将ps1改为第一位。

更好的是,有一个名为strtol的函数。它尝试从字符串中解析整数,并返回无法读取的第一个字符的位置。因此,您可以在循环中使用strtol来汇总字符串中数字的所有内容。


如果你想对数字而不是字符串中的数字求和,那就更容易了:

while (*p) {
    if (isdigit(*p))
        sum_num += *p - '0';
}

答案 1 :(得分:2)

如果要对数字求和(而不是整数),请改用以下内容:

if( isdigit(*ps1)) {
  sum_num += *ps1 - '0';
}

您还可以使用sscanf("%1d", ps1)使其只读一个字符。

答案 2 :(得分:0)

for(;*ps1!='\0';ps1++){
if (isdigit(*ps1)){
  sscanf(ps1,"%d",&number);
  sum_num+=number;
}
}

您每次向ps1增加一个字符,与正在读取的位数无关。不幸的是,您无法使用sscanf执行此任务,因为您无法知道已读取了多少个字符。

答案 3 :(得分:0)

sscanf就像应该的那样工作,它不会移动指针的开头,你在for循环中将它移动一个字符。