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

C语言修剪多单词字符串:去除首尾空格同时保留中间参数分隔空格

解决思路

你遇到的核心问题是sscanf的%s格式符默认以任意空白符为分割标记,所以只会读取到第一个空格前的内容,无法保留中间空格。你需要的是仅去除字符串首尾空白、保留中间空格的trim功能,C标准库没有内置该函数,可以手动实现。


实现代码

#include <ctype.h>
#include <string.h>

// 传入可修改的字符串指针,直接修改原字符串,返回修剪后的指针
char* trim_whitespace(char* str) {
    // 跳过开头的所有空白符
    while (isspace((unsigned char)*str)) {
        str++;
    }
    if (*str == '\0') { // 处理全是空白符的特殊情况
        return str;
    }
    // 从末尾倒序跳过所有尾部空白符
    char* end = str + strlen(str) - 1;
    while (end > str && isspace((unsigned char)*end)) {
        end--;
    }
    // 在最后一个有效字符后加字符串结束符
    *(end + 1) = '\0';
    return str;
}

适配你的业务场景的用法

你原来的代码可以修改为:

// 注意:字符串常量不可修改,要定义为字符数组才能被strtok和trim修改
char cmdline[] = "ls | sort -r "; 
char * cmd1 = strtok(cmdline, "|");
char * cmd2 = strtok(NULL, "|"); // 用|作为分割符更严谨,适配多管道场景

// 直接对两个命令字符串做trim即可,不受参数数量限制
cmd1 = trim_whitespace(cmd1);
cmd2 = trim_whitespace(cmd2);

修改后输出就是你预期的结果:

cmd1 = "ls"
cmd2 = "sort -r"

注意事项

  • 确保你传入的字符串是可修改的内存区域,不要直接传入字符串常量,否则会触发段错误
  • 该实现支持适配任意长度、任意数量参数的命令字符串,无参数个数限制
  • isspace会默认匹配空格、制表符、换行符等所有标准空白字符,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:45:00