3

このコードが間違っている理由がわかりません:

int sum = 0;

// take sum of every other digit starting with second-to-last and add to sum variable            
for (int i = length; i > 0; i -= 2)
{   
     sum += cardString[i];
     printf("%c | %i\n", cardString[i], sum);
}

長さが 15 で、"cardString" 文字列が 378282246310005 であると仮定すると、このプログラムの出力は次のようになります。

 | 0

0 | 48

0 | 96

3 | 147

4 | 199

2 | 249

2 | 299

7 | 354

正直なところ、なぜこのようなことが起こっているのか、私は途方に暮れています。何か案は?

4

7 に答える 7

5

問題:

  • あなたがすることは、数字自体ではなく、数字のASCIIコードを追加することです。
  • 追加する最初の数字は、文字列を終了する実際にはヌル文字です

変化

sum += cardString[i];

sum += cardString[i] - '0';

最初の問題を修正する必要があります。

2番目の問題は、正しい場所から開始することで修正できます。つまり、文字を終了する前に2文字です。

for (int i = length - 2; i >= 0; i -= 2)

理解を深めるために、この図を見てください。

378282246310005X  <-- last character is null
^            ^ ^
|            | |
0            | length
             |
           length - 2
于 2012-09-16T19:22:53.313 に答える
1

文字列内の文字を同等の数値に変換する必要があります。変化する:

            sum += cardString[i];

に:

            sum += cardString[i] - '0';
于 2012-09-16T19:22:40.813 に答える
1
sum += cardString[i];

思ったとおりに動作しません。0の場合は0、1の場合は1などを追加しません。代わりに、ASCII /Unicode/システムにその文字の文字コードがあるエンコードを追加します。試す

sum += cardString[i] - '0';

代わりは。

于 2012-09-16T19:23:48.383 に答える
0

文字列の文字値を合計しているのであって、それらが表す数字ではありません。

于 2012-09-16T19:23:22.067 に答える
0

数字ではなく、文字のASCIIコードを追加しています。

したがって、各桁に48のオフセットがあります: '0' == 48

于 2012-09-16T19:24:13.263 に答える
0

cardString は文字列であり、文字 {51,55,56,50,56,50,50,52,54,51,49,48,48,48,53,0} にある「378282246310005」を含みます。最初の要素は文字 '3' で、値は 51 (ASCII コード) です。期待した値の代わりに ASCII コードを追加します。
数字の値を取得するには、単純に 48 を引きます (つまり、「0」)。
ループの境界に注意してください。アクセスする最初の文字が最終的なヌル文字のようです。配列は C に基づいて 0 であることを思い出してください。

cardString[0]='3' = 51
cardString[1]='7' = 55
and so on ...
cardString[14]='5' = 53
cardString[15]='\0' = 0

あなたの長さは15だと思います...

于 2012-09-16T19:27:05.417 に答える
0

a の整数表現は、文字列に表示される文字の基数 10 表現であるchar必要はなく、通常はそうではありません。文字の ASCII 整数値が表示されます。たとえば、 の ASCII 値'0'48であるため、最初は48, 96です。出力の説明については、印刷可能な文字の ASCII チャートを参照してください。

文字を明示的に整数値に変換する必要があります。1 つのトリックは、数値0を表す文字から の整数値を減算して、整数変換を取得することです (例: '5' - '0'yields ) 5

コードには別の問題があります。ループは、文字列の末尾を1 インデックス過ぎた null 文字で開始されます。そのため、初期値はゼロです。おそらく、その値を合計に含めたくないでしょうが、その値を含めたとしても、ご覧のように、ヌル文字もゼロの整数値を持つため、合計には影響しません。より正確には、最後から 2 番目のlength - 2文字から始めたいと言っているので、コードは から始まります。

于 2012-09-16T19:31:54.563 に答える