gpt4 book ai didi

令人困惑的字符串交互

转载 作者:行者123 更新时间:2023-11-30 20:33:43 26 4
gpt4 key购买 nike

我目前正在学习 CS50 类(class),但我遇到了信用问题。这个想法是制作一个程序来根据卡的内置校验和来验证卡。第一步是每隔一个数字乘以 2,然后将乘积的所有数字加在一起。

我的代码尚未完成,但我已将其设置为打印一些中间步骤,以便我可以看到发生了什么。

#include <stdio.h>
#include <string.h>

void checksum (char number[20]);

int main (void){
char *card;

printf("Please enter a card number:");
scanf("%s", card);
if (strlen(card) == 13 || strlen(card) == 16 || strlen(card) == 15) {
checksum(card);
}
else{
printf("Not a number. Please try again.\n");
main();
}
}

void checksum (char *number) {

int check = 0;
int digits = 0;
for(int i = 1; i < 17; i += 2){
printf("No%c\n", number[i]);
digits = (number[i] * 2);
printf("D%i\n", digits);
while (digits > 0) {
check += digits % 10;
printf("C%i\n", check);
digits = digits / 10;
}
}
}

我知道第一部分远非完美,但这是我目前关心的校验和函数。当它获取第二个数字(5)时,一切都很好。但是当它根据下一行乘以 2 时,不知何故结果是 106(?)

有人能解释一下这是怎么回事吗?

terminal output

最佳答案

您读取一个字符串,即字符序列,可能采用 ASCII 格式。因此,您的输入 "1500150015001500" 实际上是一个以字符串终止字符 0x0 结尾的字符序列,例如例如 { '1', '5', '0', .... '\0' }。像 '1' 这样的单个字符值,当解释为整数值时,用它的 ASCII 代码表示,'0' 为 48, 为 49 '1',...,'5' 为 53。因此,像 char c = '5'; 这样的表达式int digital = c*2 实际上为 digit 生成 106。要将字符'5'作为整数值5,您可以编写int digital = (c - '0'),这是相同的就像您编写(53 - 48)

无需过多修改代码,测试会发生什么:

#include <stdio.h>
#include <string.h>

void checksum (char *number);

int main (void){
char card[30];

printf("Please enter a card number:");
scanf("%s", card);
if (strlen(card) == 13 || strlen(card) == 16 || strlen(card) == 15) {
checksum(card);
}
else{
printf("Not a number. Please try again.\n");
main();
}
}

void checksum (char *number) {

int check = 0;
int digits = 0;
for(int i = 1; i < strlen(number); i += 2){
printf("No%c\n", number[i]);
digits = ((number[i]-'0') * 2);
printf("D%i\n", digits);
while (digits > 0) {
check += digits % 10;
printf("C%i\n", check);
digits = digits / 10;
}
}
}

关于令人困惑的字符串交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com