这个基本代码有什么问题?

时间:2012-09-16 19:20:46

标签: c

我不知道为什么这段代码错了:

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

老实说,我不知道为什么会这样。有什么想法吗?

7 个答案:

答案 0 :(得分:5)

问题:

  • 您要做的是添加数字的ASCII码,而不是数字本身。
  • 您添加的拳头数字是实际上为空的字符,它终止字符串

更改

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

答案 1 :(得分:1)

您需要将字符串中的字符转换为其等效数字。变化:

            sum += cardString[i];

为:

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

答案 2 :(得分:1)

sum += cardString[i];

不会做你认为它做的事情 - 它不会为0添加0,为1等添加1 - 而是添加其ASCII / Unicode /无论哪种编码,您的系统都具有该字符的字符代码。尝试

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

代替。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

因此每个数字的偏移量为48:'0'== 48

答案 5 :(得分:0)

cardString是一个字符串,包含“378282246310005”,即char {51,55,56,50,56,50,50,5,5,5,5,4,4,4,4,4,4,4,5,4,5,5} 。第一个元素是字符'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 ......

答案 6 :(得分:0)

char需要而不是的整数表示形式是您在字符串中看到的字符的基数10表示形式,通常不是。您正在查看字符的ASCII整数值,例如'0'的ASCII值为 48 ,因此您的初始 48,96 。有关输出的说明,请参见ASCII图表中的可打印字符here

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

您的代码还有另一个问题:循环在一个索引过去字符串的结尾处,以空字符开头。这就是你的初始值为零的原因。据推测,你想要在你的总和中包含这个值,但如果你这样做,它就不会影响总和,因为空字符也有一个整数值为零。更准确地说,您的代码将从length - 2开始,因为您说要从倒数第二个字符开始。