首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于控制台输入string的有关问题

2014-01-14 
关于控制台输入string的问题cin的string是以空格结尾的, 所以没法将带有空格的字符串通过cin的形式在控制

关于控制台输入string的问题
cin的string是以空格结尾的, 所以没法将带有空格的字符串通过cin的形式在控制台里赋值给某个string类型的变量。虽然可以用getline()函数来部分解决这个问题,但是碰到那种比一行更长,或者多行形式的长字符串,那又不好处理了。

那么,怎么样实现这样的功能,就是在控制台里可以输入任意长短的字符串(可以带空格;以某个特定的操作,比如Ctrl+Z终止),将其赋给某个string变量? string 控制台
[解决办法]
这个问题其实与cin无关,cin背了黑锅,这种误解是对iostream缺乏足够了解导致的。

真正原因在于>>抽取运算符,>>抽取符是格式化输入,其规则是输入字符时以空白字符及\t为分隔符。

解决办法是,改用流迭代器,这时就可以读取到空格,同时,由于cin默认使用skipws删除前导空格,所以还需要noskipws,代码如下:


std::string str( std::istream_iterator< char >( std::cin >> std::noskipws ), std::istream_iterator< char >() );

[解决办法]
那么长的string为什么非要用控制台呢,真是的
[解决办法]
等待特定ctrl+z作为结束标志?

string& inputString(string& s)
{
    s.clear();
    string part;
    while(cin >> part) s.append(part);//遇到“单独的”ctrl+z时循环停止
    return s;
}

[解决办法]
引用:
这个问题其实与cin无关,cin背了黑锅,这种误解是对iostream缺乏足够了解导致的。

真正原因在于>>抽取运算符,>>抽取符是格式化输入,其规则是输入字符时以空白字符及\t为分隔符。

解决办法是,改用流迭代器,这时就可以读取到空格,同时,由于cin默认使用skipws删除前导空格,所以还需要noskipws,代码如下:


std::string str( std::istream_iterator< char >( std::cin >> std::noskipws ), std::istream_iterator< char >() );

+1
[解决办法]
getline操作的是string,又不会因为buffer不够停下来。
[解决办法]
引用:
这个问题其实与cin无关,cin背了黑锅,这种误解是对iostream缺乏足够了解导致的。

真正原因在于>>抽取运算符,>>抽取符是格式化输入,其规则是输入字符时以空白字符及\t为分隔符。

解决办法是,改用流迭代器,这时就可以读取到空格,同时,由于cin默认使用skipws删除前导空格,所以还需要noskipws,代码如下:


std::string str( std::istream_iterator< char >( std::cin >> std::noskipws ), std::istream_iterator< char >() );

+1
[解决办法]
引用:
cin的string是以空格结尾的, 所以没法将带有空格的字符串通过cin的形式在控制台里赋值给某个string类型的变量。虽然可以用getline()函数来部分解决这个问题,但是碰到那种比一行更长,或者多行形式的长字符串,那又不好处理了。

那么,怎么样实现这样的功能,就是在控制台里可以输入任意长短的字符串(可以带空格;以某个特定的操作,比如Ctrl+Z终止),将其赋给某个string变量?


晕,竟然忘了string还有个古老的getline,这个getline早在STL收入C++标准前就有了,它可以把空白字符也视作正常字符,如下两行代码就行:

std::string str;
getline( std::cin, str );

热点排行