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
相关产品推荐
相关产品推荐

