語言/CPP {cin,cout,getline,stringstream}
@LOC: 1
std::stringstream
性质
stringstream
就像是cin
一样, 比如你有个字符串string s = "123 abc 3.33"
, 然后stringstream ss( s); int a; string b; double c
, 然后通过ss >> a >> b >> c
就可以把s
里的内容 录入到a,b,c变量
里面;
看个示例:
string s;
for( ; s.size()==0; std::getline( std::cin, s)){} // s为录入一行 且都是整数
vector<int> A; // 把`s`里的整数 取出来;
{
std::stringstream ss( s);
for( int a; ss>>a;){
A.push_back(a);
}
}
std::getline
性质
string S;
, 调用std::getline( std::cin, S);
相当于std::getline( std::cin, s, '\n')
表示遇到\n
就停止录入 (注意遇到\n
会把她从cin
里去掉 但不会录入到S
里面);
1
2
假如: cin>> s; (此时`s==1` 且`cin== \n2\n`), 然后你再`getline(cin, s)` 那么此时`s==""`
因为你此时`cin`的开头就是`\n`, 因此 要把她给去掉;
所以, ___LEETCODE_
的模板里 写的是for( std::getline( std::cin, s); s.size()==0; std::getline( std::cin, s)){}
;
cin
#返回值的堵塞问题#
int a;
if( cin>> a){ 11}
else{ 22}
如果程序是从 命令行里来接收录入 即xx.exe
, 那么程序会堵塞住 等待你的录入, 如果你录入的是{空格/回车} 程序仍然是堵塞着的, 只有当你录入一个非{空格|回车}的内容 然后录入回车, 程序才会输出11
; 也就是说 此时22
的情况 是一定不会发生的;
但是如果你的程序 是从文件里接收录入 即xx.exe < data.in
, 那么程序不会堵塞, 如果文件里 只有{空格/回车} 则会输出22
, 否则输出11
;
@DELI;
#返回值#
虽然有这种代码: while( cin >> s)
, 是正确的, 但如果你写bool t = (cin >> s)
或者 while( false == (cin>>s))
, 这是错误的;
注意, cin>>s
的返回值 是一个’对象’, 不是bool, 只是说该对象里有一个bool
的重载运算符, 但你必须’显式’的强转他 即bool t = (bool)(cin >> s)
;
最好的处理是, cin
对象有一个fail()
函数, 如果返回true
则说明没有录入到数据;
代碼
class ST{
int X;
friend std::istream& operator>>( std::istream & _cin, ST & _a){
return _cin>> _a.X;
}
}
注意参数_a
不可以是const
;
cout
你的cout<< '\n'
或 cout<< "\n"
或printf("\n")
, 他到了QProcess里 都会变成\r\n
(据说这跟QProcess没关系 是编译期做的? 即只要在win平台下 就会自动转换, 比如你在notepad
里打的回车 其实他也是\r\n
,但是把 你在PlainTextEdit
里的回车 他就是\n
), 这也太不方便了把。。。 (因为我们程序就是输出的\n
。。。 (目前的做法是 手动把\r\n
替换成\n
) 有没办法 就让他输出\n
; @MARK: @LOC_0
;