【问题标题】:How to use infinite type specifiers in scanf() function in C?如何在 C 中的 scanf() 函数中使用无限类型说明符?
【发布时间】:2013-10-08 10:30:33
【问题描述】:

我想在 scanf() 函数中使用无限类型说明符 (%c)。

例如-

printf("Enter characters: \t");
scanf("--SPECIFIERS--");

所以它不确定用户将输入多少字符。我不希望我的程序询问用户“字符数”.. 但我想允许任何字符数。但它不可能在scanf() 中输入无限的%c。谁能告诉我如何在 C 中做到这一点?

【问题讨论】:

  • %s 将字符串读入缓冲区。
  • @us2012: %s 跳过前导空格并在一系列非空格字符后的第一个空格处停止。
  • 或者更简单,将scanf(%s,s)替换为gets(s)
  • @BenoitBlanchon:用肥皂或消毒剂漱口,如果你有一些非常讨厌的味道的话。不要永远向任何人推荐gets()。它不再是标准C(C11),这是一场安全灾难。建议fgets()
  • 从不(!)使用gets()。甚至在一个扔掉的例子中。

标签: c loops scanf


【解决方案1】:

我想在 scanf() 函数中使用无限类型说明符 (%c)。

您想读取未指定数量的数据。您可以尝试以下几种方法:

  • 使用 POSIX 标准 getline(3) 函数
  • scanf() 系列函数中使用 POSIX 标准 m assignment-allocation

    char *str;
    scanf("%m[^\n]", &str);
    
  • 一次读取一个字符,并在执行过程中增加一个缓冲区。 stackoverflow 上有一些函数浮动,就是这样做的

前 2 个也分配了你应该 free(3) 的内存。

【讨论】:

  • 这太棒了..我不知道这些..那么你将如何释放 str ?
  • 你可以做free(str)
  • free(str) — 与任何其他动态分配的内存相同。
  • 酷..感谢这个方便的小技巧! .. 那么 strlen(str) 扫描后当然会正常工作?
  • @sukhvir 乔纳森链接的页面说:这将导致分配一个内存缓冲区来保存转换后的字符串包括终止空字符所以这是一个相当安全的赌注。
【解决方案2】:

使用%s 作为scanf 的限定符。如下所述:

scanf("%s",buf);

其中 buf 的类型为:

char buf[100];

【讨论】:

  • 有一个您看不到的已删除答案大致说明了您的答案所说的内容。正如问题的 cmets 所述,%s 的问题在于它会跳过前导空白并在之后的第一个空白处停止。此外,如果您的缓冲区长度为 100 字节,您应该指定 "%99s"(是的,与大多数其他函数相比,这里有一个不相上下的函数)。
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多