【问题标题】:Visual Studio Code and C programmingVisual Studio Code 和 C 编程
【发布时间】:2020-12-30 09:50:24
【问题描述】:

我正在尝试学习 C,并决定使用 Visual Studio 作为练习代码的基础。我已经把所有东西都设置好了,也已经开始编写代码,但我似乎遇到了一个看不到用户输入的问题。

这是我的程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    char string[] = "";
    char reversed[] = "Placeholder";

    printf("Please enter an input string.\n");
    scanf("%s", &string);



    printf("Your original string is %s\n", string);
    printf("The string reversed is %s", reversed);

    return 0;
    
}

当我运行这个程序时,第一个 printf 语句永远不会被打印出来,也不会显示用户输入 任何地方(也不在终端中)。它只是说程序正在运行。当我强行停止它时, 它会说“完成!”这就是所有发生的事情(我必须强制停止,因为我从来没有看到输入字符串的地方,因此程序只是继续运行等待输入)。我刚刚设置了 Visual Studio,所以可能我错过了一些东西,这是一个简单的修复,但不太确定它是什么。

【问题讨论】:

  • Visual Studio 和 Visual Studio Code 是两个完全不同的产品。您标记为“visual-studio”,但您的问题是关于 vs-code?​​span>

标签: c visual-studio scanf


【解决方案1】:

您输入的字符串为空。首先避免将变量命名为“字符串”,因为标准库中可能已经定义了一个。并尝试为您的字符串分配更多空间以便能够输入数据。

`

char str[128];
char reversed[] = "Placeholder";

printf("Please enter an input string.\n");
scanf("%s", &str);



printf("Your original string is %s\n", str);
printf("The string reversed is %s", reversed);

return 0;

` 此外,请务必阅读有关 c 中的数组、字符串和函数的更多信息。您编写的代码可能无法按您的预期工作。

【讨论】:

  • scanf 中不需要&amp;scanf("%s", str);
【解决方案2】:

有几个问题。

  1. 您没有为 string 分配任何内存,因此当用户输入某些内容时,它会写入不属于它的内存中,从而导致未定义的行为。
  2. 您的scanf 是错误的,有点。您必须为它提供一个指向输入应该去的内存的指针,您提供的是指针的地址。在这种情况下,它们是同一个,但如果这是一个指向堆内存的指针,例如,&amp;string 将不会指向您保留的内存。

请尝试以下方法:

int main()
{
    char string[64] = ""; // string can now hold 63 user-input characters plus
                          // one for the NUL terminator, which scanf will add
                          // automatically.
    char reversed[] = "Placeholder";  // This reserves at least 12 bytes, 11 for the text plus the NUL terminator.

    printf("Please enter an input string.\n");
    scanf("%s", string);  // string decays to a pointer to where its memory is allocated.


    printf("Your original string is %s\n", string);

    return 0;
}

请注意,如果您输入(在这种情况下)更多 >= 64 个字符,您仍然可能会溢出您的 string 缓冲区,并且您将回到开始的位置。我相信scanf 有一种方法可以限制接受的输入数量,但需要查看如何。另一种选择是使用fgets 接受有限的输入。

【讨论】:

  • 我进行了必要的更改,但问题仍然是我实际上没有地方可以实际“测试”这个程序。我可以运行它,但它不会打印任何内容,也不会要求我输入用户信息。我在任何地方都看不到用户输入(输出或终端)。
  • @Interstellar 那么你的构建/测试环境有问题。这段代码对我来说按预期工作,系统提示我输入字符串并打印出来。我会发布一个godbolt字符串作为证据,但我不确定它是否会接受用户输入。我怀疑您认为您正在测试的实际上是您进行更改时代码的编译二进制文件。
  • 好吧,我想我解决了这个问题。必须检查终端的设置。感谢您的帮助,我没有意识到我必须这样写。
  • *godbolt URL,我的意思是。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多