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

使用strtok()拆分字符串存入数组时,如何去除末尾的换行符\n

解决read()输入末尾\n导致strtok异常的问题

这里有几个实用的方法能直接解决你的问题:

方法1:提前替换换行符为字符串结束符

用strchr()定位输入字符串里的\n,将其替换为\0,彻底去掉换行符:

#include <string.h>

// buffer是read()读取到的字符数组
char *newline = strchr(buffer, '\n');
if (newline != NULL) {
    *newline = '\0';
}

只要用户按回车提交,输入末尾必然有\n,这个方法能精准截断多余的换行。

方法2:让strtok直接忽略换行符

修改strtok()的分隔符参数,把\n也加入分隔符集合,这样strtok会自动把空格和换行都当成分割标记,无需提前修改原字符串:

// 原调用可能是strtok(buffer, " "),现在加入换行符作为分隔符
char *token = strtok(buffer, " \n");
while (token != NULL) {
    // 处理每个分割出的单词
    token = strtok(NULL, " \n");
}

这个方法更省心,直接在分割阶段就排除了换行符的干扰。

方法3:根据read()返回值截断换行符

利用read()返回的读取字节数,直接检查最后一个字符是否为\n,是的话替换为\0:

ssize_t bytes_read = read(STDIN_FILENO, buffer, BUFFER_SIZE - 1);
if (bytes_read > 0) {
    if (buffer[bytes_read - 1] == '\n') {
        buffer[bytes_read - 1] = '\0';
    } else {
        buffer[bytes_read] = '\0'; // 手动添加字符串结束符
    }
}

注意要给buffer预留至少1字节空间存放\0,避免缓冲区溢出。

额外提醒

不管用哪种方法,都要确保字符数组末尾有\0——read()不会自动添加字符串结束符,缺失的话strtok()这类字符串函数会出现未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:25:35