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

C语言中不使用strtok函数实现字符串按指定字符分割的方案

C语言实现按指定分隔符分割字符串为二维数组

你好呀!我看了你想要实现的字符串分割功能,还有你写的代码片段,这里帮你梳理问题并给出完整的可运行解决方案~

首先先说说你现有代码里的几个小问题:

  • void main 语法错误,正确写法是 void main() 或者更规范的 int main()
  • 没有声明存储原字符串的变量 longstring,得先定义一个足够大的字符数组
  • gets 函数已经被C标准废弃了,它存在缓冲区溢出的安全隐患,建议用更安全的 fgets 替代
  • 缺少分隔符的输入逻辑,以及核心的字符串分割、二维数组存储的实现

下面是完整的可运行代码,我加了详细注释方便你理解:

#include <stdio.h>
#include <string.h>

int main() {
    // 定义存储原字符串的数组,长度可根据实际需求调整
    char longstring[100];
    // 存储用户输入的分隔符
    char sep;
    // 二维数组存储分割后的子串:最多支持20个子串,每个子串最多50个字符
    char result[20][50];
    int i = 0, j = 0, sub_str_count = 0;

    // 读取原字符串
    printf("请输入一个以指定分隔符分隔的字符串(例如 jasf@fjaf@afsj):\n");
    // 用fgets替代gets,避免缓冲区溢出,同时去除fgets读取到的换行符
    fgets(longstring, sizeof(longstring), stdin);
    longstring[strcspn(longstring, "\n")] = '\0';

    // 读取分隔符
    printf("请输入分隔字符(例如 @):\n");
    // 前面的空格用于跳过输入原字符串后残留的换行符,避免误读换行符为分隔符
    scanf(" %c", &sep);

    // 核心分割逻辑
    while (longstring[i] != '\0') {
        if (longstring[i] != sep) {
            // 当前字符不是分隔符,存入二维数组的当前行
            result[sub_str_count][j++] = longstring[i];
        } else {
            // 遇到分隔符,给当前子串添加字符串结束符,切换到下一行
            result[sub_str_count][j] = '\0';
            sub_str_count++;
            j = 0;
        }
        i++;
    }
    // 处理最后一个子串(原字符串末尾没有分隔符)
    result[sub_str_count][j] = '\0';
    sub_str_count++;

    // 输出分割结果
    printf("\n分割后的子串如下:\n");
    for (int k = 0; k < sub_str_count; k++) {
        printf("%s\n", result[k]);
    }

    return 0;
}

一些关键细节说明:

  • 安全的字符串读取:用fgets替代gets,同时通过strcspn去除输入末尾的换行符,避免干扰后续的分割逻辑
  • 二维数组的使用:这里是静态定义的二维数组,如果你的场景中原字符串很长、分割后的子串数量/长度不确定,可以改用malloc动态分配内存,避免栈溢出
  • 分隔符处理:用scanf(" %c", &sep)读取分隔符时,前面的空格是为了跳过输入原字符串后留在输入缓冲区的换行符,防止误把换行符当成分隔符

你可以直接运行这段代码测试,输入示例中的jasf@fjaf@afsj和分隔符@,就能得到你想要的输出啦~

内容的提问来源于stack exchange,提问作者nim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:28