2013-03-29 9 views
0

Все решение, которое я нашел, похоже, использует atoll, но оно принимает char, когда у меня есть строка. Например, я прочитал ввод $ 100, поместил его в строку и проверил, равен ли первый символ $. Затем мне нужно преобразовать подстроку в длинный длинный тип.Как преобразовать строку в длинную длинную

int main() { 

    long long price; 
    string priceStr; 

    cin>>priceStr; 
    if (priceStr[0] == '$') { 
     price = convertToLongLong(priceStr.substr(1));//how? 
    }else{ 
     cerr<<"error!"; 
    } 

} 

Мой вход: $ 100 Спасибо!

EDIT: Возможно, я не делаю это надлежащим образом. Мой входной поток ID Название $ цена #quantity, как показано ниже, и мне нужно все номера, чтобы быть долго долго, а также проверить, если $ и # вздохи находятся в нужном месте:

1 TV $ 1500 # 50

2 LAPTOP $ 2000 # 30

+1

Что бы вы ни делали, ** не используйте **. Как вы узнаете, было ли это число 0 или он столкнулся с ошибкой? Существуют 'stoll',' strtoll', строковые потоки, 'boost :: lexical_cast' и другие, которые обеспечивают проверку ошибок. – chris

+0

... вам не нужно «долгое время» для хранения 100. – ApproachingDarknessFish

+0

нужен длинный длинный, я просто использую 100 в качестве примера ... @ValekHalfHeart – Arch1tect

ответ

1

Вы имеете несколько вариантов, если STL является единственным вариантом:

int main() { 

    long long price; 
    string priceStr; 

    cin>>priceStr; 
    if (priceStr[0] == '$') { 
     std::istringstream is (priceStr.begin() + 1, priceStr.end()); 
     is >> price; 
     if (!is) 
      cerr << "fail!" << endl; 
    }else{ 
     cerr<<"error!"; 
    } 
} 

Если вы можете использовать подталкивание:

int main() { 

    long long price; 
    string priceStr; 

    cin>>priceStr; 
    if (priceStr[0] == '$') { 
     price = boost::lexical_cast<long long>(&*priceStr.begin() + 1, priceStr.size() -1); // throws if it cannot convert. 
    }else{ 
     cerr<<"error!"; 
    } 
} 

Заметьте, что нет никаких проверки границ во втором примере , вы наверняка захотите реализовать это, прежде чем делать то, что я показал выше. (т. е. проверьте, что priceStr.size()> = 2).

Как и другие, вы можете использовать варианты stoll, но имейте в виду, что эти функции не сообщают об ошибках, если вообще.

+0

Большое спасибо Я использую ваш первый метод сейчас и изменил priceStr.begin() + 1, priceStr.end() на priceStr.substr (1) – Arch1tect

+0

Вы должны обработать сбой другого ' cin' streaming operation ala 'if (std :: cin >> priceStr) ... else ...;'. Как вы можете получить доступ к '[0]' на пустую строку - неопределенное поведение - тогда, возможно, попытайтесь построить строку, где итератор начала уже закончился. –

+0

Tony D, вот почему я заметил, что проверки границ не существует. –

1

Использование scanf

зсапЕ ("$% ДНУ", & цена);

редактировать

см выше ссылке. Быстрый и простой способ форматирования ввода.

if(scanf("%lld %s $%lld #%lld", 
    &id, name, &price, &quantity)!=4) fprintf(stderr, "error!"); 

В противном случае см. Другие ответы для более распространенных/стандартных решений.

+0

Примечание 1. Это c-стиль, 2. это не безопасный тип, 3. все вышеперечисленное.но это быстро и грязно;) – jwalk

Смежные вопросы