如何在邮件创建函数的正文部分用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
相关产品推荐
相关产品推荐

