如何在C语言中清除TXT文件读取内容中的隐藏换行符
问题原因
getline读取每行内容时,会将行尾的换行符\n(Windows系统下是\r\n)一同存入缓冲区,你只移除了逗号,换行符仍保留在最后一个参数的末尾,导致strcmp匹配失败。
解决方案
有两种常用且改造成本极低的方案可选:
方案1:读取行后直接移除尾部换行符
在getline读取成功后、处理行内容前,直接截断末尾的换行符即可,修改你的sendLine函数循环逻辑:
while ((read = getline(&line, &len, fp)) != -1) { // 新增逻辑:移除行尾换行/回车符 if (read > 0 && line[read - 1] == '\n') { line[--read] = '\0'; } if (read > 0 && line[read - 1] == '\r') { line[--read] = '\0'; } // 原有逻辑保持不变 printf("Retrieved line of length %zu:\n", read); printf("%s", line); remove_all_chars(line, ','); interpertLine(line); decodeLine(0); printf("\n"); }
该方案从源头清除换行符,后续所有处理逻辑都不需要额外适配。
方案2:修改strtok分隔符规则
你当前用strtok拆分时只把空格作为分隔符,直接将换行、回车也加入分隔符列表,strtok会自动忽略尾部的空白字符,不需要修改行处理逻辑,只需修改interpertLine函数的两处strtok参数:
void interpertLine(char currentLine[]) { // 分隔符新增换行、回车 char * token = strtok(currentLine, " \n\r"); op = token; int i = 0; while( token != NULL ) { token = strtok(NULL, " \n\r"); // 分隔符同样新增换行、回车 if(i == 0) { rs = token; } else if (i == 1) { rt = token; } else if (i == 2) { rd = token; } i++; } }
该方案不需要调整读取逻辑,同时还能兼容行尾存在多余空格的情况。
两种方案任选其一即可解决$t2匹配失败的问题。
内容的提问来源于stack exchange,提问作者CamelChop
相关产品推荐
相关产品推荐

