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

stoll function(c++11 string) giving ambiguous output

我遇到了这个问题: 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

我在 cout 中不使用 dec 的输出:

Case 1:
5 dec
5 hex

Case 2:
65 hex
1100101 bin

Case 3:
8f dec
10001111 bin

我认为您的程序行为是预期的,与 stoll 本身无关。

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

所以你只需要写

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

因为您可能已经申请了

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

早些时候