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」の形式で文字列を入力すると、数値が合計されてOKになり、目的の結果が得られることです。しかし、「w23b4e」などの文字列を入力しようとすると、次のようになります。ループ内に数値23が表示されるため、変数number=23、およびsum_num=23が表示されますが、ループ内の次のステップは次のとおりです。 number=3、およびsum_num=26。そして次のステップでsum_num= 30...これは私をかなり混乱させます。sscanf()にこのような風変わりな欠陥があるとは思わないので、何が間違っているのでしょうか。

4

4 に答える 4

5

ループ内では常に1文字だけ進みます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)1文字だけ読み取るようにすることもできます。

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

読み取られる桁数に関係なく、一度に1文字ずつps1をインクリメントします。残念ながら、読み取られた文字数がわからないため、このタスクにsscanfを使用することはできません。

于 2013-01-22T22:53:34.060 に答える
0

sscanfは正常に機能し、ポインタの先頭は移動しません。forループで1文字ずつ移動します。

于 2013-01-22T22:54:54.657 に答える