【问题标题】:VS code c++ cin not working with string typeVS code c++ cin 不适用于字符串类型
【发布时间】:2021-10-08 02:23:22
【问题描述】:

这是一个简单的 hello 程序,但如果我运行它,它什么也不会显示。

#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Please enter your name: ";
    string username;
    cin >> username;
    cout << "hello, " << username << ", ..., goodbye\n";
}

输出: 终端里什么都没有

单个cout可以工作,所以我猜可能是string引起的缓冲区问题。

#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Please enter your name: ";
    //string username;
    //cin >> username;
    //cout << "hello, " << username << ", ..., goodbye\n";
}

输出:

Please enter your name: 

但是添加 flush 并不能使它起作用。

#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Please enter your name: ";
    string username;
    cin >> username;
    cout << "hello, " << username << ", ..., goodbye\n" << flush;
}

输出:终端中没有任何内容

然后我把username的类型改成char, int,都正常工作了。

#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Please enter your name: ";
    char username;
    cin >> username;
    cout << "hello, " << username << ", ..., goodbye\n";
    
    cout << "Please enter your name: ";
    int username;
    cin >> username;
    cout << "hello, " << username << ", ..., goodbye\n";

}

输出:

Please enter your name: asdf
hello, a, ..., goodbye


Please enter your name: 123 
hello, 123, ..., goodbye

以上是code-runner运行的,所以我尝试手动编译,还是不行。

DINO@DINO-Amadeus MINGW64 /d/DINO/code/essential_c++
$ g++ -o chap1 chap1.cc

DINO@DINO-Amadeus MINGW64 /d/DINO/code/essential_c++
$ ./chap1

DINO@DINO-Amadeus MINGW64 /d/DINO/code/essential_c++
$

有人可以帮忙吗?非常感谢。

【问题讨论】:

  • @JaMiT 已编辑,您现在可以看看这个问题吗?
  • 您的最后一个测试用例无法编译(多个同名变量),即使编译它也肯定不会产生显示的输出(输入asdf,第一个&gt;&gt; 会只读a,留下sdf 由第二个&gt;&gt; 读取并失败)。
  • 该代码对我有用(好吧,除了必须将您的最后一个示例分成两个程序之外),而且我看不到这里潜伏着未定义的行为。所以肯定有其他事情发生。
  • @Remy Lebeau 但这些只是微不足道的无效输入。真正的问题是第一个程序可以编译但不允许我输入。
  • @KOMAX233 can't reproduce。默认情况下,cincout 应该是 tie()'d 一起,因此读取输入将首先刷新任何缓冲输出。你所描述的让我想知道它们是否由于某种原因没有在你的系统上捆绑在一起。无论如何,在您的 flush 示例中,您冲错了地方。在第一个cout 之后和cin 之前执行它,而不是在第二个cout 之后:cout &lt;&lt; "Please enter your name: " &lt;&lt; flush;

标签: c++ visual-studio-code cin


【解决方案1】:

我能够编译您的第一个示例,

#include <iostream>
#include <string>
using namespace std;
int main() {
  cout << "Enter name" << endl;
  string username;
  cin >> username;
  cout << "Hello, " << username <<  ", goodbye\n";
}

并让它在 Codeblocks 的控制台中按预期工作。

Enter name
John Doe
Hello, John, goodbye

Process returned 0 (0x0)   execution time : 3.623 s
Press any key to continue.

它也是通过cygwin手动编译的。

*****@DESKTOP-******* /cygdrive/c/Users/*****/Documents/Programs/Test/test
$ g++ main.cpp -o main

*****@DESKTOP-******* /cygdrive/c/Users/*****/Documents/Programs/Test/test
$ ./main
Enter name
John Doe
Hello, John, goodbye

这一切让我觉得代码没问题,而真正的问题在别处。你说你正在使用 coderunner。这是为了上课吗?您也许可以看到其他学生的不同之处。

编辑 2021 年 10 月 9 日 让我们尝试以下操作,看看出了什么问题:

  1. 是否是命名空间的问题,看看下面的代码是否有效:(如果你输入“Hello”,它会打印“Hello”)
#include <iostream>
#include <string>
int main() {
  std::string username;
  std::cin >> username;
  std::cout << username;
}
  1. 要查看问题是否出在 cin,试试这个(它应该输出“Hello”)
#include <iostream>
#include <string>

int main() {
  std::string username = "Hello";
  std::cout << username;
}
  1. 而且,作为登月计划:(与 (1) 的行为相同)
#include <iostream>

int main() {
  char* username[5];
  scanf("%s",&username);
  printf("%s",username);
}

【讨论】:

  • 不幸的是,不,这不是为了上课.. 我找到a very similar question,但似乎没有人真正回答这个..
  • 可能是因为那里也没有人能弄清楚。让我们看看我们是否至少可以缩小范围。我正在添加一些尝试的编辑,这至少有助于了解问题的根源。
  • operator&gt;&gt; 停止读取空白,因此cin &gt;&gt; username 无法返回John Doe,如您所示,它将返回John。要读取包含空格的字符串,您必须改用getline(cin, username)
  • 另外,您的示例与 OP 的第一个示例完全相同。您在 cout 提示后添加了 &lt;&lt; endl。这将隐含地flush 输出缓冲区。
  • 你说得对,我也尝试过使用它,并且可能已经粘贴了它。它是固定的。
【解决方案2】:

尝试更改运行代码的 VSCode 的扩展名,如果可以,请更新到最新版本。如果您使用的是.run,请尝试C/C++ Compile Run by danielpinto8zz6 或类似的。

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2018-11-21
    • 2018-01-17
    • 2019-08-04
    • 2021-12-17
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多