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

使用fgets()与char**存储分词时如何消除多余空行?

问题解决:分词打印时出现多余空行的处理

问题根源

fgets会将输入末尾的换行符\n一同读入字符串,当以空格为分隔符调用strtok分词时,最后一个token会包含这个\n。打印时,printf自带的\n加上token中的\n,就会产生多余空行。此外,你分配的token_arr未设置终止的NULL指针,第二个while循环可能读取到随机非空值,导致额外输出。

解决步骤

  • 清理原字符串的换行符:在fgets读取完成后直接处理原字符串,这和用char**存储token完全不冲突:
    str[strcspn(str, "\n")] = '\0';
    
    这行代码会把字符串中的换行符替换为字符串结束符,后续所有分词结果都不会携带换行。
  • 给token数组添加终止标记:在分词循环结束后,给token_arr的末尾赋值NULL,确保第二个while循环能正确识别数组边界:
    token_arr[pos] = NULL;
    

修改后的完整代码

char str[1024];
fgets(str, 1024, stdin);
// 移除末尾换行符
str[strcspn(str, "\n")] = '\0';

const char s[2] = " ";
char *token;
char ** token_arr = malloc(100 * sizeof(char*));
int pos = 0;

token = strtok(str, s);

while( token != NULL) {
  token_arr[pos] = token;
  printf( "%d %s\n", pos, token );
  pos++;
  token = strtok(NULL, s);
}
// 设置数组终止标记
token_arr[pos] = NULL;

int i = 0;
while (token_arr[i]) {
  printf("%d %s \n", i, token_arr[i]);
  i++;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:30:58