2

我在以下代码中遇到了 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,所以 variablenumber=23和 s um_num=23,但循环中的下一步是:number=3sum_num=26。在下一步中sum_num= 30......这让我很困惑。既然我不相信 sscanf() 有这么古怪的缺陷,我做错了什么?

4

4 回答 4

5

你总是在循环中前进一个字符:ps1++. 您可能想要前进ps1到第一位数字。

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


如果您想对数字求和而不是在字符串中找到数字,则更容易:

while (*p) {
    if (isdigit(*p))
        sum_num += *p - '0';
}
于 2013-01-22T22:52:21.590 回答
2

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

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

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

于 2013-01-22T22:53:51.967 回答
0
for(;*ps1!='\0';ps1++){
if (isdigit(*ps1)){
  sscanf(ps1,"%d",&number);
  sum_num+=number;
}
}

您一次将 ps1 增加一个字符,与读取的数字数量无关。不幸的是,您不能将 sscanf 用于此任务,因为您无法知道已读取了多少个字符。

于 2013-01-22T22:53:34.060 回答
0

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

于 2013-01-22T22:54:54.657 回答