2010-08-04 1 views
2

У меня такая же проблема в Ubuntu 10.04 с использованием gcc4.4, тот же код работает штраф на RH 5.5 с помощью gcc4.1stringstream не отвечает «потоковым» отрицательным значениям в неподписанных типах?

#include <sstream> 
#include <iostream> 

int main(int argc, char** argv) { 

    std::stringstream myStream; 
    myStream << "-123"; 

    unsigned int myUInt; 
    myStream >> myUInt; 

    if(myStream.fail()) { 
    std::cout << "FAILED" << std::endl; 
    } 
} 

не дают FAILED, я уже нашел:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39802

, где указано, что она была исправлена ​​в gcc4.1, не уверен, что если мисс вести себя (если я что-то отсутствует) связана с той же проблемой.

ответ

1

Я не уверен, почему вы ожидаете его неудачи. sscanf() также не подведет, но читает число, а потоки C++ должны работать как функция Scanf:

#include <stdio.h> 

int main(int argc, char** argv) { 
    unsigned int n; 
    if (! sscanf("-1", "%ud", & n)) { 
     printf("fail\n"); 
    } 
    else { 
     printf("%ud", n); 
    } 
} 

печатает 4294967295d.

А также см. Также stringstream unsigned conversion broken?.

+0

Потому что на RH5.4 с компилятором 4.1 он терпит неудачу. Также я не уверен в том, что stringstream должен вести себя как scanf. Не говоря уже о том, что boost :: lexical_cast полагается на то, что он должен потерпеть неудачу, я действительно обнаружил, что строка string не терпит неудачу из-за того, что boost :: lexical_cast ("- 123") не бросает. Ссылка, которую вы указали в конце, что она будет исправлена ​​для 4.4.1, но актуальна, что сбой кода с 4.4.3 –

+0

@kalman Да, это ошибка! Это было в 4.1, и было исправлено позже. Кроме того, вы можете видеть из другого вопроса, что есть некоторые дебаты о том, что такое «правильное поведение2». – 2010-08-04 15:50:14

+0

Итак, вы имеете в виду, что строка stringstream не работает при потоковой передаче «-123» в неподписанном типе, это была ошибка, а не функция? –