C语言多文件随机字符串生成程序输出乱码如何解决?
C语言随机字母字符串生成乱码问题修复方案
问题根因
generateChars函数的for循环末尾多写了多余分号,导致循环逻辑空转,仅在循环结束后给myarr[len]赋值了1次,前len个位置的栈内存完全未初始化,输出时就会出现固定乱码符号╠- 未初始化随机数种子,每次程序运行生成的随机字符串完全相同
offsetChars函数逻辑冗余且判断顺序错误:z的特殊判断放在了普通字符判断之后,会导致z先被赋值为z+1(即字符{),无法正确转为a- 主函数传递数组参数时不需要加
&取地址符,数组名本身就是指向首元素的指针,原写法不规范
修复后完整代码
mysource.h
// 增加头文件保护避免重复引入 #ifndef MYSOURCE_H #define MYSOURCE_H void generateChars(char *myarr, int len); void offsetChars(char *myarr, int len); void printChars(char *myarr, int len); #endif
mysource.c
#include <stdio.h> #include <stdlib.h> #include "mysource.h" void generateChars(char* myarr, int len) { int i = 0; char letters[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; // 移除for循环末尾多余分号 for (i = 0; i < len; i++) { myarr[i] = letters[rand() % 26]; } } void offsetChars(char *myarr, int len) { int j; for (j = 0; j < len; j++) { // 简化逻辑,无需嵌套循环 if (myarr[j] == 'z') { myarr[j] = 'a'; } else { myarr[j] += 1; } } } void printChars(char *myarr, int len) { int i; for (i = 0; i < len; i++) { printf("%c", myarr[i]); } }
myMain.c
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "mysource.h" int main() { int n; // 初始化随机数种子,保证每次运行生成不同的字符串 srand((unsigned int)time(NULL)); printf("How many random characters do you want to generate?: "); // 注意:如果编译器不支持scanf_s可替换为scanf("%i", &n); scanf_s("%i", &n); if (n >= 1024) { printf("输入长度不能超过1023"); return 1; } char myarr[1024] = {0}; printf("\nOriginal Combo:\n"); // 直接传数组名,无需取地址 generateChars(myarr, n); printChars(myarr, n); printf("\nOffset Combo:\n"); offsetChars(myarr, n); printChars(myarr, n); return 0; }
编译运行说明
- 编译时将mysource.c和myMain.c加入同一编译目标即可,完全符合双源文件的项目要求
- 输入长度建议不超过1023,避免数组越界
内容的提问来源于stack exchange,提问作者Harl23
相关产品推荐
相关产品推荐

