【问题标题】:Getting input from user using cin [duplicate]使用 cin 从用户那里获取输入 [重复]
【发布时间】:2010-02-02 12:56:16
【问题描述】:

我正在使用 Turbo C++ 3.0 编译器

使用以下代码时..

char *Name;
cin >> Name;
cout << Name;

当我输入空格时......它唯一保存在空格之前输入的字符.. 就像我输入“QWERT YUIOP”一样...名称将包含“QWERT”;

任何解释为什么??

【问题讨论】:

  • 转储 Turbo C++,使用更好的编译器。

标签: c++ cin


【解决方案1】:

当cin 用于读入字符串时,它会自动在空白处换行,除非您另外指定。

std::string s;
std::cin >> noskipws >> s;

或者,如果您想获得一整行,请使用:

std::getline(cin, s);

您还需要为原始 char 数组分配存储空间,但对于 C++,您无论如何都应该使用 std::string 或 std::wstring。

【讨论】:

  • @Poita_:我认为您不了解 noskipws 的工作原理。如果您使用“cin >> noskipws >> str”并且用户输入“a b c”,则 str 将包含“a”,其余输入将丢失。如果你想用空格阅读整个文本,则必须使用 getline()。
【解决方案2】:

您需要为要读取名称的字符数组分配空间。 char *Name; 将不起作用,因为它只声明了一个 char 指针而不是一个 char 数组。类似char Name[30];

另外cin &lt;&lt; 只允许我们在字符串中输入一个单词(字符名[30])。
但是,有一个 cin 函数可以读取包含空格的文本。

cin.get(name, MAX)  

get 将读取所有字符,包括空格,直到 Max 个字符 已读取或到达行尾字符 ('\n') 并将它们放入 进入名称变量。

【讨论】:

  • cin.get 将分隔符 ("\n") 留在缓冲区中,这通常不是您想要的。这就是为什么通常最好使用 cin.getline(name, MAX)。
【解决方案3】:

你刚刚声明了一个不指向任何东西的字符指针。您需要为您的字符串分配空间。最常见的方法是在堆栈上分配空间,IE:

char Name[50];

请记住,char 指针本身只是将地址放置到实际内存所在的位置。您仍然必须获得一块内存并将地址存储在指针中。上面的代码在堆栈上创建了一个 Names 数组,您可以使用 Name 存储最多 49 个字符和一个空终端。

或者,对于可变长度字符串,使用 std::string。

【讨论】:

  • 鉴于他的编译器大约有 15 年的历史,它还没有std::string。为此,您需要 21 世纪的编译器。
  • @MSalters 好点。没有看到编译器:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多