あなたのコードは以前のものと同じ計算をしないためです。最初のものでは、ポインタを次の番号に移動していて、それを番号に追加しているので、あなたのコードは次のようになります44 + 10 + 11 + 5
。
2番目のケースでは、文字コードが0と9の間であるが、数字が48と57の間であることを確認しています - 文字 '0'と '9'。したがって、if
ステートメントは常に間違っています。あなたの意図はおそらくこれでしたが、うまくいかないでしょう。
for(i = 0; i < 100 ; i++){
if(!(str[i]>='0' && str[i]<='9')){ //if str[i] is not a number
sum += atoi(str+i);
}
}
また、これは、ここであなたは、次の番号の読み取りで、その結果、1によってポインタの間違ったシフトを行っているため、動作しません:44, 4, 10, 0, 11, 1, 5
。 atoi
プロパティのためです。you`dは、次のコードを記述する必要があります前にしていた正確に同じコードを実行するには、次のよう
int skip_non_diggits(int i, char *str) {
while (str[i] < '0' || str[i] > '9') {
if (str[i] == 0)
return -1; //end of string case
i++;
}
return i;
}
int skip_diggits(int i, char *str) {
while (str[i] >= '0' && str[i] <= '9') {
if (str[i] == 0)
return -1; //end of string case
i++;
}
return i;
}
をこれらの機能を使用することができる:
int i = 0, sum = 0;
while (i != -1) {
sum += atoi(str+i);
i = skip_diggits(i, str); // positions i after the current number
i = skip_non_diggits(i, str); // positions i at the begin of the next number
}
ところで for (i = 0; i < 100; i++)
を使用しないでくださいあなたがサイズを知らない弦を反復する。文字列の長さが100よりも短い場合は、メモリがデリフェアされている可能性があります。これはおそらく未定義の動作を生成するものではありません。代わりにstrlen
メソッドをチェックするか、文字が\0
と等しくないかどうかをチェックします。これはCで文字列の最後を示します。
あなたはあなたの質問を、回答の中で提供されているループの「訂正された」変種で編集しました。もしあなたが*これらを試したが、あなたが期待した結果が出てこなかったら、あなたの元の*以下のセクションに新しいコードを追加してください。 – Makoto
現在の問題ではなく、 'i'が' 0'から '100'まで変化するので、あなたの式に関係のない数字を解析する' str'バッファの最後を読み取るでしょう。 'for(i = 0; i
44-10 + 11/5 = 13は正しいですか? –