【问题标题】:scanf and getchar together to read stringscanf 和 getchar 一起读取字符串
【发布时间】:2019-05-29 09:42:06
【问题描述】:

我有这个代码:

Hotel new_h = (Hotel*)malloc(sizeof(Hotel));
printf("\nInsert name -> ");
scanf("%[^\n]s", new_h->name);
getchar();

首先,它是如何工作的 %[^\n]s

为什么 scanf 中不只有 %s?

为什么还有getchar?

【问题讨论】:

  • 本文档:sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html 将为您解释%[^\n]s 语法。
  • getchar() 在这里消耗来自stdin 的剩余\n
  • 简而言之:使用%[^\n]s 语法,您的酒店名称可以有空格。
  • 我认为它也适用于scanf("%[^\n]", new_h->name);
  • 顺便说一句:"%[^\n]s" 应该是"%[^\n]" 最后不需要s[^\n] 不是 %s 转换的限定符。它本身就是一种转换。

标签: c string scanf getchar


【解决方案1】:

在这种情况下,getchar() 函数只有在您要在酒店名称之后进行以下输入时才需要,在这种情况下,我建议您在 %s 之前添加一个空格,例如 scanf(" %[^\n]s", new_h->name); .

关于malloc() 您对酒店的定义如何,因为它必须被声明为指针,因此您可以为其分配内存,将其转换为类型指针是不够的,它会导致您出现段错误应该将其声明为

Hotel *new_h = malloc(sizeof(Hotel));

这是考虑到您将酒店定义为类似的东西

typedef struct{
    //Some vars
}Hotel;

【讨论】:

  • " %[^\n]s" 中的 s 毫无用处。
  • 令人惊讶的是它也没有造成太大的伤害:D
  • @AnttiHaapala 更好地使用"%[^\n]" 使用类似"%99[^\n]" 的宽度。在那个更好的用例中,"%99[^\n]s" 中的 s 可能会造成伤害。
  • 真实数据:D
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多