定义字符串in-code与console输入之间的区别

时间:2012-02-10 06:59:50

标签: c++ string input

我正在研究数据结构类的项目。目标是使用一棵树来判断隐喻矮人是否可以用隐喻钻石支付他们的隐喻税。输入格式为“3 1 2 3 3 1 2 3”,其中3个钻石的价值为1 2 3,3个税收成本为1 2 3.

我遇到的问题不是从树的实现开始,而是处理将输入解析为可以将其插入树中的方式,特别是:当我在测试时直接在代码中输入值时给出正确的输出,但是当使用cin时输出会遇到一些问题。

使用以下代码:

string str;
str = "5 1 2 3 4 5 5 1 2 3 4 5";


str.erase(remove_if(str.begin(), str.end(), ::isspace), str.end());
char ch[str.size()];
strcpy(ch, str.c_str());

int numDiamonds = ch[0] - '0';
cout<<numDiamonds<<" diamonds"<<endl;

int counter = 1;

for(int i = 1; i < numDiamonds+1; ++i){
    int out = ch[i] - '0';
    cout<<out;
    cout<<" ";
    ++counter;
}

cout<<endl;

int numTaxes = ch[numDiamonds+1] - '0';

cout<<numTaxes<<" taxes"<<endl;
for(int i = counter+1; i < str.size(); ++i){
    int out = ch[i] - '0';
    cout<<out;
    cout<<" ";
}
cout<<endl;
}

我的输出显示正确,如下所示:

5 diamonds
1 2 3 4 5
5 taxes
1 2 3 4 5

但是当我将“str = 5 1 ...”更改为“cin&gt;&gt; str”时,我的输出显示混乱,并且如下所示。

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

1 diamonds
-48
-48 taxes

2 diamonds
-48 -48
-48 taxes

3 diamonds
-48 -48 -48
-48 taxes

4 diamonds
-48 -48 -48 -48
-48 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

1 diamonds
-48
-48 taxes

2 diamonds
-48 -48
-48 taxes

3 diamonds
-48 -48 -48
-48 taxes

4 diamonds
-48 -48 -48 -48
-48 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

没有任何谷歌搜索有助于解决我的问题,所以我转过身来。有没有解释为什么cin到一个字符串有不同的行为比在代码中定义字符串?

谢谢!

3 个答案:

答案 0 :(得分:3)

这是因为输入在遇到空格时结束,即它只读取第一个数字。请改用cin.getline()

确切的输入行是:getline(cin, str),因为您正在使用std::string,否则cin.getline()也会完成这项工作。

答案 1 :(得分:1)

尝试使用std :: getline(cin,str)。

答案 2 :(得分:-1)

cin只占用下一个空格字符。

您可以使用cin.getline,但更好的选择是,查看您使用它的方法是为每个整数循环cin

所以你可以这样做:

vector<int> input;

int x;
while (cin.good()) {
    cin >> x;
    input.push_back(x);
}

cin.good()只检查流是否仍然......好,好。如果流有问题(例如,如果你到达流的末尾),它返回0.如果你知道它的格式,这是从stdin检索项的好方法,而且通常你是如何从stdin中读取的ICPC / topcoder问题。使事情变得更简单,你不同意吗? :)