如何移除strtok最后一次返回结果中的'\n'?手动尝试未成功
解决strtok最后一个token末尾'\n'无法移除的问题
你的问题出在strtok的分隔符仅设置了空格,而输入字符串末尾的\n不属于分隔符范畴,会被完整保留在最后一个token里。直接定位到最后一个token并修改即可解决,以下是调整后的代码:
int parseCommand(char *inputCommand, struct Command *command){ int i = 0; char *token; token = strtok(inputCommand, " "); while(token != NULL){ command->argv[i] = token; token = strtok(NULL, " "); i++; } command->argc = i; command->commandName = command->argv[0]; // 移除最后一个参数末尾的换行符 if (command->argc > 0) { char *lastArg = command->argv[command->argc - 1]; // 方法1:用strchr查找换行符并替换为字符串结束符 char *newline = strchr(lastArg, '\n'); if (newline != NULL) { *newline = '\0'; } // 或者用方法2:直接检查最后一个字符 // size_t len = strlen(lastArg); // if (len > 0 && lastArg[len - 1] == '\n') { // lastArg[len - 1] = '\0'; // } } /*-----------FOR DEBUG-----------*/ /* printf("%s : est le nom de la commande\n", command->commandName); for(int j = 0; j<i; j++){ printf("command->argv[%i] %s\n",j, command->argv[j]); } */ // 补充返回值,避免编译警告 return command->argc; }
关键说明:
- 先判断
command->argc > 0,避免无token时数组访问越界 - 两种处理方式二选一:
strchr能定位到任意位置的\n,适合换行符可能出现在token中间的场景;直接检查最后一个字符则更高效,适合确认换行符在末尾的情况 - 原函数缺少返回语句,补充后可消除编译警告
内容的提问来源于stack exchange,提问作者Arnaud Derison
相关产品推荐
相关产品推荐

