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

如何在邮件创建函数的正文部分用fgets读取用户输入的回车键?

解决邮件正文用fgets读取回车键的思路

嘿,我来帮你捋捋这个问题~首先得明确:fgets()本身是会把用户输入的回车键(也就是换行符\n)一起读进字符串里的,这其实刚好契合邮件正文需要换行排版的需求,核心问题大概率是怎么处理多行输入的结束逻辑,或者你可能误解了fgets对换行符的处理方式,下面分场景给你具体解决思路:

1. 保留用户输入的换行,实现多行邮件正文输入

如果你的需求是让用户输入多行正文,直到主动触发结束(比如按两次回车,或者输入单独一行的.),可以用循环调用fgets的方式:

示例代码(按两次回车结束输入)

#include <stdio.h>
#include <string.h>

#define MAX_EMAIL_BODY 2048  // 根据需求调整正文最大长度

int main() {
    char email_body[MAX_EMAIL_BODY] = {0};
    char input_line[256];  // 每行输入的缓冲区

    printf("请输入邮件正文(连续按两次回车结束输入):\n");
    while (fgets(input_line, sizeof(input_line), stdin) != NULL) {
        // 判断是否是单独的换行符(用户只按了回车)
        if (strcmp(input_line, "\n") == 0) {
            break;
        }
        // 安全地把当前行追加到正文缓冲区,避免溢出
        if (strlen(email_body) + strlen(input_line) < MAX_EMAIL_BODY) {
            strcat(email_body, input_line);
        } else {
            printf("警告:邮件正文已达最大长度,停止输入\n");
            break;
        }
    }

    // 打印测试结果
    printf("\n你输入的邮件正文是:\n%s", email_body);
    return 0;
}

这段代码里,用户每输入一行按回车,fgets会把整行(包括末尾的\n)读入input_line,然后追加到邮件正文里;当用户单独按回车时,input_line里只有\n,此时触发循环结束,完成正文输入。

2. 若需去除换行符(不推荐用于邮件正文)

如果特殊场景下你不需要保留换行符(但邮件正文一般需要排版换行,这个场景比较少见),可以用strcspn()函数快速去掉fgets读入的换行符:

fgets(input_line, sizeof(input_line), stdin);
// 把换行符替换为字符串结束符
input_line[strcspn(input_line, "\n")] = '\0';

3. 关键注意事项

  • 缓冲区溢出防护:一定要确保邮件正文的缓冲区足够大,或者用snprintf()来安全追加内容,避免内存溢出:
    snprintf(email_body + strlen(email_body), MAX_EMAIL_BODY - strlen(email_body), "%s", input_line);
    
  • 终止条件自定义:你也可以改成其他结束逻辑,比如用户输入单独一行的.(类似传统邮件客户端的结束方式),只需要把strcmp(input_line, "\n") == 0改成strcmp(input_line, ".\n") == 0即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:31:23