stoll函数(c ++ 11字符串)给出不明确的输出

时间:2015-10-23 09:14:28

标签: c++11 hex std data-conversion base-conversion

我遇到了这个问题: https://www.urionlinejudge.com.br/judge/en/problems/view/1193

    /*input
3
101 bin
101 dec
8f hex
*/
/*************************************************************
 * Purpose : https://www.urionlinejudge.com.br/judge/en/problems/view/1193

 * Author: Sahil Arora

 * Version: 1.0

 * Date: 22/10/15

 * Bugs : None

*************************************************************/
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
    /* code */
    std::ios_base::sync_with_stdio(false);
    int test;
    cin>>test;
    for(int i=1;i<=test;++i){
        cout<<"Case "<<i<<":\n";
        string str,base;
        long long num,j;
        cin>>str>>base;
        if(base=="dec"){
            num = stoll(str,nullptr);
            cout<<hex<<num<<" hex\n";
            bitset<32> bin(num);
            for(j=31;bin[j]==0 && j>=0;--j)
                ;
            while(j>=0)
                cout<<bin[j--];
            cout<<" bin\n\n";
        }
        else if(base=="hex"){
            str = "0x" + str;
            num = stoll(str,nullptr,16);
            cout<<dec<<num<<" dec\n";                   // <--focus on this line
            bitset<32> bin(num);
            for(j=31;bin[j]==0 && j>=0;--j)
                ;
            while(j>=0)
                cout<<bin[j--];
            cout<<" bin\n\n";
        }
        else{
            num = stoll(str,nullptr,2);
            cout<<dec<<num<<" dec\n"<<hex<<num<<" hex\n\n";     
        }   
    }
    return 0;
}

现在将第45行更改为:

cout<<num<<" dec\n";

hex的输出更改。它提供了与hexdec的输入相同的输出。我无法理解它为什么会出现这样的错误。另外,如果我只输入1个测试用例,它会为hex提供正确的输出,但在提交时仍会给出20%的错误答案!

输入:

3
101 bin
101 dec
8f hex

预期产出:

Case 1:
5 dec
5 hex

Case 2:
65 hex
1100101 bin

Case 3:
143 dec
10001111 bin

我的输出未使用dec中的cout

Case 1:
5 dec
5 hex

Case 2:
65 hex
1100101 bin

Case 3:
8f dec
10001111 bin

1 个答案:

答案 0 :(得分:2)

我相信你的程序行为是预期的,与stoll本身无关。

因此,std::hexstd::dec(和std::oct)是修改输出库的操纵器。一旦应用,它们将不会重置(例如,它会从std::setw更改它们)。这就是为什么每次想要改变输出基数时都应该重新应用操纵器。

所以你只需要写

std::cout<<std::dec<<num<<" dec\n"; 

因为你可能已经申请了

std::cout<<std::hex<<num<<" hex\n";

早些时候