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

