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

