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 代码,而不是数字本身。
  • 您添加的第一个数字是终止字符串的 acutally 空字符

改变

sum += cardString[i];

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

应该解决第一个问题。

第二个问题可以通过从正确的位置开始来解决,即在终止字符之前的两个字符:

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

cardString 是一个字符串,包含“378282246310005”,即 char {51,55,56,50,56,50,50,52,54,51,49,48,48,48,53,0}。第一个元素是字符“3”,其值为 51(ascii 代码)。您添加 ascii 代码而不是您期望的值。
要获得数字的值,只需减去 48(即“0”)。
注意循环中的边界,您访问的第一个字符似乎是最终的 nul 字符:记住数组在 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

您正在总结字符串的字符值,而不是它们所代表的数字。

于 2012-09-16T19:23:22.067 回答
0

您正在添加字符的 ASCII 代码,而不是数字值。

所以每个数字都有一个 48 的偏移量:'0' == 48

于 2012-09-16T19:24:13.263 回答
0

a 的整数表示char不必是您在字符串中看到的字符的以 10 为基数的表示,而且通常不是您会看到字符的 ASCII 整数值,例如 ASCII 值为'0'48 因此您的初始值为48, 96。有关您的输出的说明,请参阅此处的可打印字符的 ASCII 图表。

您需要将字符显式转换为整数值。一个技巧是0从表示数字的字符中减去 的整数值,以获得整数转换,例如'5' - '0'yield 5

您的代码还有另一个问题:循环从字符串末尾的一个索引开始,在空字符处。这就是为什么你的初始值为零。大概您不想在总和中包含该值,但如果您这样做,如您所见,它不会影响总和,因为空字符也具有零整数值。更准确地说,您的代码将从 开始length - 2,因为您说要从倒数第二个字符开始。

于 2012-09-16T19:31:54.563 回答