在我的代码的一部分中,我应该逐个获取字符。这很容易,但我的问题是如何将这些字符逐个添加到字符串中。请注意,我不知道会得到多少个角色。
重要的是只在字符串中复制字符。换句话说,我想从角色生成单词,直到角色不等于' '
或'\n'
。
我写的错误代码是:
char c;
string str = NULL;
cin.get(c);
while (c != " ")
{
str += c;
cin.get(c);
}
cout << str ;
例如,如果字符c
最初为'H'
,然后为'i'
,
我希望"Hi"
上的字符串str为cout
!
答案 0 :(得分:4)
=!
应为!=
,字符串" "
应为' '
字符。
如果您想检查换行符和空格:
while (c != ' ' && c != '\n')
或者
while (!std::isspace(c))
将读取任何空格字符。
您还应该检查流的结尾或其他问题:
while (cin.get(c) && !std::isspace(c)) {
str += c;
}
答案 1 :(得分:1)
如果您只想阅读空格或换行符:
std::getline( cin, str, ' ' );
答案 2 :(得分:1)
c ++ stringstreams在构建字符串时也很有用
stringstream ss;
while (cin.get(c) && !std::isspace(c)) {
ss << c;
}
string s = ss.str();
cout << s;
答案 3 :(得分:0)
您的代码中的错误是您没有检查换行符。
此外,它应该是!=
而不是=!
。第二个选项实际上在代码中表现为c = (!(" "))
。另一个错误是您应该检查空格字符' '
而不是空字符串" "
。
这是正确的代码:
char c;
string str = "";
while (true)
{
cin.get(c);
cout << "c is " << c << endl;
if ((c == ' ') || (c == '\n'))
break;
str += c;
}
cout << str << endl ;
此外,如果您的要求是在遇到空格字符时停止I / O,请参阅此问题:C - Reading from stdin as characters are typed
此处提出的所有解决方案将继续读取输入,直到输入换行符号为止,因为在此之前您的输入尚未处理,而是存储在缓冲区中。
答案 4 :(得分:0)
如果您的str
空出来,这很简单:
string str;
cin >> str; // cin's >> operator already reads until whitespace
cout << str;
答案 5 :(得分:-1)
如果你事先不知道它会有多少个字符,我会声明一个std :: list,将元素推送到它,然后将它们复制到一个字符串中。这可确保您不会在每次添加时重新分配字符串内存:
char c;
list<char> buff;
cin.get(c);
while (c != ' ' && c != '\n')
{
buff.push_back (c);
cin.get(c);
}
string str (buff.size(), 0);
size_t i = 0;
while (!buff.empty())
{
str[i] = buff.front();
buff.pop_front();
++i;
}
cout << str ;