如何用C语言数组生成随机句子?程序报错及乱码问题排查
解决随机句子生成的报错/乱码问题
嘿,我一眼就瞅出你代码里的问题啦!为啥会报错或者输出乱码?核心原因是数组越界访问了!
问题分析
你定义的article、noun、verb、preposition这几个数组,每个都只有5个元素,对应的合法索引范围是0到4。但你生成随机索引的时候用了rand() % 6,这会生成0-5的随机数——当随机数抽到5的时候,就会去访问数组里根本不存在的第6个元素(数组索引从0开始),这属于未定义行为,结果就是要么报错,要么输出乱码。
修正方案
把所有rand() % 6改成rand() % 5就能解决基础问题!不过更稳妥的方式是动态计算数组长度,避免硬编码数字,以后修改数组元素数量也不用再改取模值,代码更健壮。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include <string.h> int main() { srand(time(NULL)); // 定义各词类数组 char *article[] = {"the" , "a" , "one" , "some", "any"}; char *noun[] = {"boy" , "girl" , "dog" , "town", "car"}; char *verb[] = {"drove" , "jumped" , "ran" , "walked", "skipped"}; char *preposition[] = {"to" , "from" , "over" , "under", "on"}; // 动态获取数组长度,避免硬编码数值 int article_len = sizeof(article) / sizeof(article[0]); int noun_len = sizeof(noun) / sizeof(noun[0]); int verb_len = sizeof(verb) / sizeof(verb[0]); int prep_len = sizeof(preposition) / sizeof(preposition[0]); // 生成合法范围内的随机索引 int r1 = rand() % article_len; int r2 = rand() % noun_len; int r3 = rand() % verb_len; int r4 = rand() % prep_len; int r5 = rand() % article_len; int r6 = rand() % noun_len; printf("%s %s %s %s %s %s\n", article[r1], noun[r2], verb[r3], preposition[r4], article[r5], noun[r6]); return 0; }
额外说明
用sizeof(数组名)/sizeof(数组元素类型)的方式计算数组长度,是C语言里常用的小技巧——它会自动根据你数组里的元素数量计算出长度,以后你要是给某个数组加新的词,比如给noun加个cat,根本不用改后面的随机数生成代码,直接加元素就行,再也不用担心越界啦!
内容的提问来源于stack exchange,提问作者Co_Co
相关产品推荐
相关产品推荐

