2017-02-12 111 views
0

我正在研究一个C++程序,它将字符串作为输入并以某种方式对其进行处理。这是代码:出现在输入字符串位置的奇怪字符

string input; 
cin >> input; 
char arg = input[4]; //All inputs always have 5 characters 
cout << arg << endl; 

输入:加d

我期待它打印d到屏幕上,而是没有打印任何 此外,对于其他投入,我有时会收到奇怪的字符(如ÿ以两个点作为输出)。

为什么会发生这种情况,如何纠正?

+0

心灵来发布[MCVE]再现您的问题吗? –

+0

修复错字后,所有内容[按预期工作](http://ideone.com/E2iBWf)。 –

+0

您在评论“所有输入总是有5个字符”中写道,但实际上您的输入“添加d”只有三个字符(查看第一个标记)。 – Brandin

回答

3

注意的operator<<std::string提取停在空白,所以input值会add,然后char arg = input[4];是UB。

...然后从is读取字符并仿佛 str.append(1, c)它们附加到str,直到下列条件之一 真:

  • ...

  • std::isspace(c,is.getloc())true为下一个字符cis(此空白字符保留在输入流中)。

您可以使用std::getline代替读取包含空格输入,它会读取字符串,直到指定分隔符;默认的是endline。例如

string input; 
std::getline(std::cin, input); 
+2

我看不出标准版本的重要性。对于长度为3的字符串,输入[4]总是超出范围。 – Brandin

+0

应该注意的是,自从C++ 11以后,'input [3]'不会是未定义的行为,但确实会返回一个空字符的引用。但是,修改该引用仍然是未定义的行为。无论如何,'input [4]'总是未定义的行为,因为内部使用的数组只有4个元素('“add”'加上空字符)。 –

0

在您的示例中,当您输入(添加d)时,只会考虑空格之前的字符。 所以有输入[4]的垃圾值

如果你想输入空格,使用双引号。

#include <iostream> 
using namespace std; 
int main(void) 
{ 
string input; 
cin >> input; 
char arg = input[4]; //All inputs always have 5 characters 
cout << input.length() << endl; 
cout << arg << endl; 
} 

如果你通过加d,字符串的长度将是3而不是5 如果您希望能够输入空格,与std::getline(std::cin, input);

更换cin >> input; ,你会得到想要的结果。

4

在您的输入字符串中,cin>>运算符将您的字符串带到空间,然后它将终止。所以在你的字符串中只有add会出现,所以当你试图访问第四个字符并且什么都不会显示。

尝试,

string input;  
getline(cin, input);  
char arg = input[4];  
cout << arg << endl;