C语言使用fgets读入输入时,如何将字面\r\n转换为真实换行符输出
C语言fgets读取输入后转换字面
\r\n为真实换行的实现方案 问题核心:fgets读取的是用户实际敲入的原始字符。用户输入的
\r\n是4个独立的可打印字符(\、r、\、n),而非转义后的控制字符(\r=回车、\n=换行),因此需手动遍历字符串完成替换。
可行实现代码
#include <stdio.h> #include <string.h> int main() { char buff[1024]; printf("Msg for server: "); memset(buff, 0, sizeof(buff)); // 读取标准输入(自动处理缓冲区边界) fgets(buff, sizeof(buff), stdin); // 可选:去除fgets自带的末尾换行符(用户敲回车产生的) buff[strcspn(buff, "\n")] = '\0'; // 双指针法替换字面\r\n为真实换行 int raw_idx = 0, processed_idx = 0; int raw_len = strlen(buff); // 遍历至倒数第3位,避免匹配4字符序列时越界 while (raw_idx < raw_len - 3) { // 匹配字面`\r\n`(C中字面反斜杠需用'\\'表示) if (buff[raw_idx] == '\\' && buff[raw_idx+1] == 'r' && buff[raw_idx+2] == '\\' && buff[raw_idx+3] == 'n') { // 替换为真实换行(若需CRLF可改为连续写入'\r'和'\n') buff[processed_idx++] = '\n'; // 跳过已匹配的4个原始字符 raw_idx += 4; } else { // 不匹配则原样保留字符 buff[processed_idx++] = buff[raw_idx++]; } } // 处理剩余未遍历的字符(不足4位的尾部) while (raw_idx < raw_len) { buff[processed_idx++] = buff[raw_idx++]; } // 确保处理后的字符串以'\0'结尾 buff[processed_idx] = '\0'; // 验证输出 printf("Processed output:\n%s\n", buff); return 0; }
关键说明
- 双指针法的优势:无需额外开辟缓冲区,直接在原buff上原地处理,避免内存浪费
- 匹配逻辑:必须用
'\\'(而非'\')表示用户输入的字面反斜杠,因为C语言中单引号内的\是转义起始符 - 边界处理:遍历终止于
raw_len - 3,是因为要匹配4位连续字符,防止访问buff外的内存 - 可选优化:若需同时支持单独的字面
\n(如用户输入test\nabc),可在循环中补充匹配'\\'+'n'的逻辑,替换为'\n'
效果验证
输入样例(用户实际敲入):test\r\ntest2
处理后输出:
Processed output: test test2
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

