C 读取字符串中的enter键

C 读取字符串中的enter键,c,string,store,enter,C,String,Store,Enter,我正在使用创建电子邮件的功能,但我不知道如何使用身体部位的fgets读取用户的“输入”。我的代码如下: void read_email_interactive(Email* email) { printf("Subject: "); fgets(email->subject,DEFAULT_MAX_FIELD,stdin); printf("From: "); fgets(email->from,DEFAULT_MAX_FIELD,stdin); printf("To: ");

我正在使用创建电子邮件的功能,但我不知道如何使用身体部位的
fgets
读取用户的“输入”。我的代码如下:

void read_email_interactive(Email* email) {
printf("Subject: ");
fgets(email->subject,DEFAULT_MAX_FIELD,stdin);

printf("From: ");
fgets(email->from,DEFAULT_MAX_FIELD,stdin);

printf("To: ");
fgets(email->to,DEFAULT_MAX_FIELD,stdin);

printf("Body: ");
fgets(email->body,MAX_BODY,stdin);

printf("ID: ");
fgets(email->id,DEFAULT_MAX_FIELD,stdin);

有什么想法吗?谢谢大家!

假设文本的最大大小是可以接受的,下面的代码段可以:

#define BODY_MAX_LEN (1234)

struct Email
{
   char body[BODY_MAX_LEN + 1];
   ...
}

int main(void)
{
  struct Email email = {0};

  size_t s = 0;
  while ((BODY_MAX_LEN > s) && fgets(email.body + s, BODY_MAX_LEN + 1 - s, stdin))
  {
    s = strlen(email.body);
    if (!s || ('\n' != email.body[s - 1]))
    {
      break; /* EOF detected (user pressed Ctrl-D (UNIX)/Ctrl-Z  (Window). */
    }
  }

  if (ferror(stdin))
  {
    perror("fgets() failed");
    exit(EXIT_FAILURE);
  }

  ...
之后

 printf("Subject: ");
投入

fflush(stdout);

这样消息就会出现

fgets()
并读取新行!是的,但在正文消息中,用户通常会按几个“回车键”,但在这里,如果我按回车键,它将进入下一个屏幕,身体部分由多条线组成,你想把它们当作块来阅读吗?这个想法是考虑阅读身体,当用户进入空行时,你会发现身体已经完成了,让我们移动到下一节。您也可以按照此命令执行其他命令。@JIANCHEN:刚才说了解决方案。重新设计代码,将空行合并为部分的结尾。@usr2564301:当然可以。谢谢你指出这一点。更正。