我在以下代码中遇到了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=3
和sum_num=26
。并在下一步sum_num= 30
...
这让我很困惑。既然我不相信sscanf()有这样一个古怪的缺陷,我做错了什么?
答案 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循环中将它移动一个字符。