2016-09-04 10 views
-1

のためでは動作しません。私は、この式の出力を取得しようとしています:ATOI機能がループ

44から10 + 11月5日

それは次のように正常に動作:

char str[] = "44 - 10 + 11/5"; 
int sum = 0 ; 
sum += atoi(str); // 0 + 44 
sum += atoi(str+3); // 44 + 10 
sum += atoi(str+5); // 54 + 11 
sum += atoi(str+7); // 65/5 = 13 
printf("%d/n",sum); // output = 13 

が、私はforループでatoi()機能を置けばそれは動作しません:

char str[] = "44 - 10 + 11/5"; 
int sum = 0; 
int i; 
sum += atoi(str); 
for (i = 0; i < 100; i++) { 
    if (!(str[i] >= 0 && str[i] <= 9)) { //if str[i] is not a number 
     sum += atoi(str + i); 
    } 
} 
printf("%d/n", sum); // output = 0 
+1

あなたはあなたの質問を、回答の中で提供されているループの「訂正された」変種で編集しました。もしあなたが*これらを試したが、あなたが期待した結果が出てこなかったら、あなたの元の*以下のセクションに新しいコードを追加してください。 – Makoto

+0

現在の問題ではなく、 'i'が' 0'から '100'まで変化するので、あなたの式に関係のない数字を解析する' str'バッファの最後を読み取るでしょう。 'for(i = 0; i

+0

44-10 + 11/5 = 13は正しいですか? –

答えて

3

数値のASCIIを含むchar値を実際の数値と比較しています。

if(!(str[i]>='0' && str[i]<='9')){ 

if(!(str[i]>=0 && str[i]<=9)){ 

を変更し、残りのコードが正しいかどうかは確認しませんでしたが、確かに、これは問題の1つです。

+0

正しいものは 'isdigit'です。 – Olaf

2
if(!(str[i]>=0 && str[i]<=9)){ //if str[i] is not a number 

これは間違っています。 '0'と0は同じではありません。 9と9のどちらもありません。 '9'の値は、ASCIIチャートで '9'を表す整数になります。

論理の残りの部分は、例えば55があれば何が起きるのでしょうか、ifを55回、5回目は2回入力しますか?

+0

atoi関数は、指定された文字列の番号をアドレスパラメータから次の非数字文字にex: として返します。atoi(str + 3)は10を返します。 atoi(str + 5)は11を返します 私は非数値文字を取得し、str + iを渡します。私は非数字文字の位置です –

+0

@AhmedYasenこれは私が何を意味したのですか:https://ideone.com/1C17Ck –

+0

私はあなたを理解していますが、文sum + = atoi(str + i) は実行されませんstr [i]は数字ではないので、次の数字の始まりになります –

1

これはちょっと奇妙なようです。目標は何ですか?

前のコメントに同意します。

なぜあなたは数字ではないのでatoi()をやっていますか?

文字列の最後を通過します。 例のスペースCOUNTは

などとなります。 番号を見つけたらiを更新しないので、最初に44を44と数えます。

デバッガを学習し、コードをステップ実行し、データがどのように変化するかを確認したい場合は、こちらをご覧ください。

+2

この答えを書式設定するには時間をかけてください。あなたが言うことは正しいが、まったく読めない。 –

2

あなたのコードは以前のものと同じ計算をしないためです。最初のものでは、ポインタを次の番号に移動していて、それを番号に追加しているので、あなたのコードは次のようになります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, 5atoiプロパティのためです。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で文字列の最後を示します。

+0

atoi(str + 5)も10を読み込みます。私は彼がそこにも間違いがあると思う –