仿atoi功能程序添加for循环后无输出,删除则正常,求原因
问题分析与解决:野指针引发的未定义行为
你的代码核心问题是野指针非法访问内存,导致了不可预测的未定义行为:
你声明了char *string;但没有为它分配任何内存空间,这是一个指向随机内存地址的野指针。当你用scanf("%s", string);往里面写入输入内容时,会非法篡改不属于程序的内存区域——这种行为的结果是不确定的:有时候删除for循环时,内存错误没有立刻触发崩溃,程序看似能运行;但添加for循环后,内存布局的变化让错误直接暴露,程序异常终止,所以没有任何输出。
修正方案
有两种简单的方式解决这个问题:
方案1:使用固定大小的字符数组
直接定义足够容纳输入数字的字符数组,避免野指针问题:
#include <stdio.h> #include <stdlib.h> int main() { int cont = 0, array[10]; // 定义足够大的数组,比如容纳最多9位数字+结束符 char string[100]; printf("Insert a number: "); scanf("%s", string); while (string[cont] != 0) { // 用'0'替代48,代码可读性更高 printf("%d\t", string[cont] - '0'); array[cont] = string[cont] - '0'; cont++; } for (int i = 0; i < 3; i++) { printf("bruh\n"); } // 实现你想要的atoi功能 long long result = 0; for (int i = 0; i < cont; i++) { result = result * 10 + array[i]; } printf("\n转换后的整数:%lld\n", result); return 0; }
方案2:动态分配内存
如果需要更灵活的内存大小,可以用malloc动态分配,记得最后释放内存:
#include <stdio.h> #include <stdlib.h> int main() { int cont = 0, array[10]; // 分配100字节的内存空间 char *string = malloc(100 * sizeof(char)); // 检查内存分配是否成功 if (string == NULL) { perror("内存分配失败"); return 1; } printf("Insert a number: "); scanf("%s", string); while (string[cont] != 0) { printf("%d\t", string[cont] - '0'); array[cont] = string[cont] - '0'; cont++; } for (int i = 0; i < 3; i++) { printf("bruh\n"); } // 实现atoi功能 long long result = 0; for (int i = 0; i < cont; i++) { result = result * 10 + array[i]; } printf("\n转换后的整数:%lld\n", result); // 释放动态分配的内存 free(string); return 0; }
额外注意点
- 用
string[cont] - '0'替代-48,代码可读性更强,因为字符'0'的ASCII值就是48。 - 用
long long存储转换结果可以避免输入大数字时的整数溢出问题。
内容的提问来源于stack exchange,提问作者Xtres5
相关产品推荐
相关产品推荐

