【问题标题】:scanf Function doesn't work in vscode for some reason, any tip?scanf 函数由于某种原因在 vscode 中不起作用,有什么提示吗?
【发布时间】:2022-01-20 15:36:54
【问题描述】:

习惯了printfC中的变量,然后我开始使用scanf函数,代码如下(无耻盗用fresh2refresh.com)

#include <stdio.h>
int main()
{
   char ch;
   char str[100];
   printf("Enter any character \n");
   scanf("%c", &ch);
   printf("Entered character is %c \n", ch);
   printf("Enter any string ( upto 100 character ) \n");
   scanf("%s", &str);
   printf("Entered string is %s \n", str);
}

除了它没有运行,无论是在 vscode 输出还是 cmd 上。它甚至没有从第 5 行打印“输入任何字符”,它表明代码正在运行,但甚至不接受输入(并且只有在我单击停止代码运行按钮后才会停止)

有什么建议吗?

【问题讨论】:

  • scanf("%s", &amp;str); 是错误的。应该是scanf("%s", str);。但我怀疑这会阻止它正常工作。 (在你说“但我认为我总是需要&amp;scanf 之前,是的,这是真的,除了%s 是该规则的一个例外。这是与@987654327 相邻的许多令人讨厌的事情之一@.)
  • printf 现在可以工作了,但是 scanf 不行
  • @SteveSummit,我认为自己是一位经验丰富的 C 程序员,我偶尔会使用 scanf。事实上,我认为这是我的调味品的一个标志,我知道什么时候这样做是合理的(不是特别频繁),以及当我选择使用 scanf 时如何让我安全可靠地工作。
  • 请准确显示您输入的内容。您是否键入了一个字符键,然后按 键?在你按下 之前什么都不会发生。
  • @ChaoticNeutralFurry 我对 vscode 一无所知,但我看到很多像你这样的问题。我不知道它是默认还是错误,或者是容易犯的配置错误,或者什么,但我们经常听到它甚至无法运行最基本的程序。这是令人震惊的沮丧,因为如果你只是在学习,你自然会认为你一定犯了一个错误。

标签: c variables visual-studio-code printf scanf


【解决方案1】:

Visual Studio Code: Take Input From User

有一个类似问题的老问题。 (我试图将此标记为重复,但开放的赏金阻止了它。)

【讨论】:

  • 优秀。非常感谢。我希望这对@ChaoticNeutralFurry 有所帮助。 (而且,除非我在这里弄错了,看起来 vscode 已经成功地采用了那个可爱的旧模式,例如:“你检查了 'workCorrectly' 选项吗?没有?难怪它对你不起作用!它没有被检查默认,你知道的。”)
【解决方案2】:

线

  scanf("%s", &str);

不正确 - 应该是

  scanf("%99s", str);

所以

  1. 它有边界 - 即不是数组超出边界
  2. 它正在传递一个char *

顺便说一句 - 检查来自 scanf 的返回值可能是个好主意

【讨论】:

  • 无法到达该部分进行测试,但一旦我得到,我就不能测试它
  • @ChaoticNeutralFurry 重点是,虽然我怀疑额外的&amp; 会导致您的问题,但理论上它确实会使您的程序行为未定义,因此理论上任何事情都可能发生。因此,为了消除所有疑问,您需要进行更改,然后重新运行您的程序,并告诉我们您是否仍然看到相同的结果。
【解决方案3】:

你可以选择:运行->添加配置...->launch.json 改变这个:"externalConsole": true,

【讨论】:

    【解决方案4】:

    format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Wformat=] scanf("%s", &amp;str);

    字符串表示为字符数组,因此数组名是一个标识符(隐式转换为指针)是第一个元素的地址,因此无需指定'&'在读取字符串的情况下。

    从警告中可以清楚地看出它无法从 char (*)[100] 转换为 char *

    【讨论】:

      【解决方案5】:

      在 C 中,字符串是字符缓冲区的地址,这就是为什么我们不需要“&”和变量。 Code with solution

      【讨论】:

      • 请将您的代码直接发布到答案中,无需添加将来可能会失效的额外网址。
      【解决方案6】:

      我的英语很差。希望能帮到你!!

      scanf("%s", &str); 这句话是假的。 你知道指针,还是内存地址?

      如果你知道,假设你是 scanf 的创建者。你需要做的是阅读用户在屏幕上写的内容并将它们复制到第二个参数的空间。 所以,你不关心第二个参数的值。你关心的是第二个参数的地址。然后就可以访问这个内存空间了。 所以,当第二个参数是变量时,比如int a,就需要"&a"。 但是 str 本身可以是一个地址。所以不需要"&"

      【讨论】:

      • 谢谢,但正如赏金通知所说,问题不在于 scanf("%s", &str) 中多余的 &。
      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多