我不知道为什么这段代码错了:
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
老实说,我不知道为什么会这样。有什么想法吗?
答案 0 :(得分:5)
问题:
更改
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
开始,因为您说要从倒数第二个字符开始。