C语言随机姓名生成器修复后仍无法正常运行问题求助
问题根因
你遇到的两个异常都是基础的类型和内存使用错误导致的:
- 数组元素数量不符:你用单个
char类型变量cast1存储用户输入的数组长度,单字节char只能存0-255的数值,输入两位数以上长度直接溢出;同时循环判断条件写的是i<cast1,这里直接拿字符的ASCII编码值当循环上限(比如输入字符'3',ASCII值是51,循环会跑51次,但你实际申请的数组长度只有3),内存越界后读写混乱,自然读不到正确数量的元素。 - 输出NULL/0:你定义的
parr1是单字符数组,每个位置只能存1个字节,根本存不下完整的姓名字符串;再加上你用单个char变量tempchar接%s格式的字符串输入,写入时直接越界破坏栈内存,数组里存的内容完全被破坏,打印时自然出不来正确姓名。
除此之外代码还有两个隐性bug:一是rand()没有初始化随机种子,每次运行随机结果完全固定;二是while循环没有退出逻辑,一旦进入就会无限死循环。
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_NAME_LEN 32 // 定义单个名字的最大允许长度 int main() { int i; int arr_len; // 直接用int类型存储数组长度,避免单char的转换、溢出问题 printf("Choose array length: "); scanf("%d", &arr_len); // 定义二维字符数组:共arr_len个元素,每个元素可以存最长MAX_NAME_LEN-1的姓名 char name_arr[arr_len][MAX_NAME_LEN]; // 循环上限使用读入的合法长度值,保证存入元素数量和预期一致 for(i = 0; i < arr_len; i++) { printf("Name to insert to array: "); // 直接读取姓名到数组对应位置,限制读取长度防止缓冲区溢出 scanf("%31s", name_arr[i]); } int logic; char answer; printf("Would you like to generate a new name?[y1/n2]: "); scanf("%d", &logic); answer = (logic == 1) ? 'y' : 'n'; // 初始化随机数种子,整个程序只需要初始化一次 srand((unsigned int)time(NULL)); while(answer == 'y') { int rand_idx = rand() % arr_len; // 用%s格式输出完整姓名字符串,而非%c输出单个字符 printf("Random picked name: %s\n", name_arr[rand_idx]); // 增加继续询问逻辑,避免死循环 printf("Generate another?[y1/n2]: "); scanf("%d", &logic); answer = (logic == 1) ? 'y' : 'n'; } return 0; }
关键修改说明
- 把长度存储变量从单
char改为int类型,直接用%d读取用户输入的长度值,循环判断直接使用读取到的合法长度,解决元素数量不符、内存越界的问题。 - 把名字存储数组从一维单字符数组改为二维字符数组,每个数组位可以存储完整的姓名字符串,读取姓名时直接写入对应数组位,同时增加读取长度限制避免缓冲区溢出。
- 新增随机数种子初始化逻辑,保证每次运行程序的随机抽取结果不同;输出格式从
%c改为%s,正确打印完整姓名。 - 给循环增加继续询问的判断逻辑,避免程序进入无响应的死循环。
内容的提问来源于stack exchange,提问作者anatolii123
相关产品推荐
相关产品推荐

