添加循环后C程序中int值异常变更的问题求助
你的问题本质是未定义行为——代码里存在未初始化的变量,导致程序行为随机,加循环只是改变了栈内存的布局,让原本隐藏的问题暴露出来了,不是循环本身的错。
核心bug:未初始化的results数组
在luhnsI函数里,你定义了char results[l];但没有初始化。strcat函数要求目标字符串必须以\0(空字符)结尾,否则它会从内存里随机找一个空字符的位置开始拼接,这会导致内存越界、数据混乱,甚至程序崩溃。
不加循环时,栈上results的内存碰巧有一个早期的空字符,所以strcat能正常工作;加了循环后,栈布局变了,results的初始内存里没有空字符,strcat就乱拼接,最后atoi解析出来就是0。
修复步骤:
初始化
results为空字符串
把char results[l];改成:char results[l] = {0}; // 用{0}初始化会把整个数组填0,自然包含结尾的空字符或者用
memset手动清空:memset(results, 0, sizeof(results));优化
string数组的大小number = r_array[x] * 2的结果最大是18(9*2),所以string数组只需3个字节(两位数字+空字符),改成char string[3];更安全,避免不必要的内存占用。重置全局变量
index
全局变量index在调用get_reversed后不会自动清零,如果后续多次调用verify_card,r_array会从上次的位置继续写入,导致数据错误。可以在get_reversed函数开头加上index = 0;,或者把index改成get_reversed的局部变量。修正返回值问题
verify_card声明返回string类型,但你返回了0,这不符合要求,应该返回一个合法的字符串,比如"INVALID"或者"VALID"。
修复后的luhnsI函数示例:
int luhnsI(int l) { int number; char string[3]; // 足够存两位数+空字符 char results[l] = {0}; // 初始化空字符串 // 取从倒数第二位开始的每隔一位的数字 for (int x = 1; x < l; x = x + 2) { number = r_array[x] * 2; sprintf(string, "%d", number); strcat(results, string); } int results_num = atoi(results); // 后续可以添加各位数字求和的逻辑 return results_num; }
补充说明:
C语言中,局部变量如果不初始化,会包含栈上的随机垃圾值,这种情况下的行为是未定义的——可能正常、可能出错、可能每次运行结果都不一样。养成初始化局部变量的习惯,能避免很多这类诡异问题。
内容的提问来源于stack exchange,提问作者Mamushi

