You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言分割字符串存入数组触发段错误,求解决提示

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:35:10