簡體   English   中英

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

[英]How does sscanf() see numbers in a string?

我在以下代碼中遇到了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()有這樣一個古怪的缺陷,我做錯了什么?

在循環中,您總是只前進一個字符: ps1++ 您可能想將ps1提升到第一位。

更好的是,有一個名為strtol 它嘗試解析字符串中的整數,並可以返回無法讀取的第一個字符的位置。 因此,您可以在循環中使用strtol對所有看起來像數字的東西求和。


如果要對數字求和而不是對字符串中的數字求和,則比較容易:

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

如果要對數字求和(而不是整數),請使用以下代碼:

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

您也可以使用sscanf("%1d", ps1)使其僅讀取一個字符。

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

您一次將一個字符增加ps1,而與要讀取的位數無關。 遺憾的是,您無法使用sscanf執行此任務,因為您無法知道已讀取了多少個字符。

sscanf就像應該的那樣工作,它不會移動指針的開頭,你在for循環中將它移動一個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM