You need to enable JavaScript to run this app. C语言使用fgets读入输入时,如何将字面\r\n转换为真实换行符输出
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 08:45:11