2013-05-29 3 views
0

Мне нужно хранить значение в int16_t от stdint.h. Как я могу прочитать это значение с терминала пользователя?C++ read int16_t (компилятор G ++)

Способ от ответа (So, we have int32_t, int16_t, uint64_t, etc.. But where are the atoi32, atoi16, atoui64, etc...?) не работает на компиляторе Ubuntu g ++.

Предпочитаю использовать стандартные библиотеки C++. Что-то вроде:

#include <cstdio> 
#include <stdint.h> 
#include <iostream> 

using namespace std; 

int main (void) { 
    char value [] = "111"; 
    int16_t tmp; 

    if (sscanf (value, "%???", & tmp) == 1) cout << "OK" << endl; 

    return 0; 
} 

Или лучше прочитать стандартное целое число, а затем преобразовать его?

Я не использую C++ 11.

+1

Вы используете C++ 11? Если это так, вам нужно добавить пробел между строковым литералом и идентификатором: 'scanf ("% "SCNd16, &tmp);', потому что иначе он будет интерпретировать его как суффикс. –

+0

Извините, я забыл написать его. t использовать C++ 11, но спасибо. –

ответ

2

Прекратите использование старых функций C, и начать использовать C++ функциональность:

std::string value = "111"; 

std::istringstream is(value); 
if (is >> tmp) 
    std::cout << "OK\n"; 

Если вы хотите, чтобы прочитать его от пользователя, а затем использовать std::cin вместо:

if (std::cin >> tmp) 
    std::cout << "OK\n"; 
+0

Работает отлично, спасибо :-). Я не знаю, почему я думал, что поток не нравится типам из stdint.h. –

+0

@PeterK. В большинстве случаев на современных компьютерах 'uint16_t' является просто псевдонимом для' unsigned short'. –

+1

Ли поток io действительно делает c-style printf/scanf семантикой устаревшей? Является std >> cin >>> std :: blah :: blahblah :: yadaddadadada >> some_weird_anaconda_snake_long_expression действительно намного превосходит хороший ole sscanf? Я еще не видел разработчика C++, который бы дал мне безоговорочное «да» на этом. – AlexK