C语言分割字符串存入数组触发段错误,求解决提示
嘿,我来帮你拆解这段代码里的问题,段错误的根源其实是几个明显的内存和类型错误,咱们一个个说:
空数组引发的内存越界
你定义的char function[] = {};是一个没有分配任何存储空间的空数组,当你用scanf往里面写入用户输入的字符串时,完全没有足够的内存来容纳内容,这会直接破坏程序的内存布局,是触发段错误的核心原因之一。你需要给它分配足够的空间,比如char function[100];(可以根据实际需求调整大小),确保能装下用户输入的内容。指针存储的类型不匹配
你想用word数组存储strtok返回的字符串指针,但char word[nb_terms];是一个字符数组,每个元素只能存单个字符,根本装不下指针地址。正确的做法是定义一个指针数组:char* word[nb_terms];,这样每个元素才能存放strtok返回的char*类型的指针。scanf的参数错误
使用scanf("%s", &function)是错误的,因为function作为数组名本身就代表数组的首地址,直接写scanf("%s", function)就可以了,加&反而会导致类型不匹配(&function是指向整个数组的指针,而%s需要的是char*类型)。输入缓冲区的换行符遗留问题
当你用scanf("%d", &nb_terms)读取数字后,输入缓冲区里会留下一个换行符,后面的scanf("%s", function)会直接读取这个换行符作为空字符串,导致后续分割逻辑出错。可以在读取数字后加一句getchar();来吃掉这个换行符,或者用scanf(" %s", function)(注意前面的空格,会自动跳过空白字符)。
另外,还要注意防止数组越界:在while循环里最好加个cpt < nb_terms的判断,避免分割出的元素数量超过word数组的大小;打印word[1]之前也要判断一下是否有足够的元素,防止访问不存在的内存。
下面是修正后的完整代码:
#include<stdio.h> #include<string.h> int main () { // 给function分配足够的存储空间 char function[100]; char *pch; int cpt = 0; int nb_terms = 0; printf("Entrez le nombre de termes :\n"); scanf("%d", &nb_terms); // 读取数字后吃掉缓冲区里的换行符 getchar(); // 定义指针数组,存储分割后的字符串指针 char* word[nb_terms]; printf("Entrez votre fonction en n'utilisant que les 5 caractères suivants (a,b,c,d et +) :\n"); // 直接传入数组名作为字符串地址 scanf("%s", function); pch = strtok(function, "+"); // 增加判断,防止数组越界 while (pch != NULL && cpt < nb_terms) { word[cpt++] = pch; printf("%s\n", pch); pch = strtok(NULL, "+"); } // 先检查是否有足够的元素,再访问word[1] if (cpt > 1) { printf("%s\n", word[1]); } else { printf("没有足够的元素可以显示\n"); } return 0; }
内容的提问来源于stack exchange,提问作者ben

