【问题标题】:Reading an enter in a string读取字符串中的输入
【发布时间】:2018-07-21 02:56:18
【问题描述】:

我正在使用一个函数来创建电子邮件,但我不知道如何在正文部分使用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);

有什么想法吗?谢谢!

【问题讨论】:

  • fgets() 确实读取了换行符!
  • 是的,但是在正文消息中,用户通常会按几个“输入”,但在这里如果我按输入,它将进入下一条指令
  • 我明白了,正文部分由 od 多行组成 - 你想将它们作为一个块来阅读吗?
  • 这个想法是考虑阅读正文,当用户输入一个空行时,您会发现正文已完成让我们进入下一节。您也可以按照此命令执行其他命令。
  • @JIANCHEN.: 刚才说了解决方法。稍微重新设计代码,将空行作为部分的结尾。

标签: c string store enter


【解决方案1】:

假设文本的最大大小是可以接受的,下面的 sn-p 会做:

#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);
  }

  ...

【讨论】:

  • @usr2564301:当然。感谢您指出了这一点。已更正。
【解决方案2】:

之后

 printf("Subject: ");

放一个

fflush(stdout);

这样消息就出现了

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多