2013-09-02 2 views
0

Так что я принять сообщение (МВП) и преобразовать его на все числа, используя десятичную базу (A = 65, B = 66 и т.д.)Преобразовать строку в десятичное базовый C++

До сих пор, Я принял сообщение и сохранил его как строку, и я пытаюсь преобразовать его в десятичную базу, используя поток строк. Это правильный способ сделать это или есть более простой/эффективный способ?

Вот что у меня есть:

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main() 
{ 

string msg; 
int P; 
cout << "Enter a something: "; 
cin >> P; 
cout << "Enter your message: "; 
cin.ignore(256, '\n'); 
getline(cin, msg); 
cout << endl << "Message Reads: " << msg << endl ; 

int emsg;         // To store converted string 
stringstream stream;      // To perform conversions 
stream << msg ;       // Load the string 
stream >> dec >> emsg;       // Extract the integer 
cout << "Integer value: " << emsg << endl; 
stream.str("");       // Empty the contents 
stream.clear();       // Empty the bit flags 


return 0; 
} 

Пример Run:

Enter a something: 3      // This is used just to make things go smoothly 
Enter your message: This is a message // The message I would like converted to decimal base 

Message Reads: This is a message   // The ascii message as typed above 
Integer value: 0       // I would ultimately like this to be the decimal base message(Ex: 84104105 ...etc.) 
+0

Считаете ли вы, что этот код работает? Просто код не соответствует описанию выше. Но описание выше немного запутанно. Возможно, вам следует предоставить примерный ввод и ожидаемый результат. Сделаем все более ясным. Просто скажите что-то вроде «если вход ABC я ожидаю, что выход будет ...». – john

+0

Спасибо, пост отредактировал – user2059300

ответ

0

Вам не нужно использовать stringstream, это намного проще, чем просто приведение к unsigned char (если у вас есть символы с отрицательной кодировкой), а затем в int.

cout << "Integer value: "; 
for (size_t i = 0 ; i < msg.size(); ++i) 
    cout << static_cast<int>(static_cast<unsigned char>(msg[i])); 
cout << "\n"; 

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

+0

Это сработало отлично! Огромное спасибо! – user2059300

+0

Эй, спасибо за это, это было действительно полезно, есть ли способ туннелировать этот вывод в целое число? (и в боковом я должен открыть это как новый вопрос?) – user2059300

+0

Если я правильно понимаю вас, проблема будет состоять в том, что «84104105 ...» будет слишком большим целым числом для C++ для ручка. В большинстве реализаций целых чисел C++ не может быть больше 4 миллиардов (или около того). Если вы хотите преобразовать строку в целые числа, то вам придется искать большую целую библиотеку. – john

1

Если вы хотите, чтобы преобразовать каждый символ в строке его ASCII эквивалент (который, кажется, что вы хотите) то вам придется перебирать строку и просто принимать каждый символ в виде числа.

Если у вас есть компилятор, который есть range-based for loops тогда просто сделать

for (const char& ch : msg) 
{ 
    std::cout << "Character '" << ch << "' is the same as " 
       << static_cast<int>(ch) << '\n'; 
} 

Если у вас есть старый компилятор, а затем использовать обычные итераторы:

for (std::string::const_iterator itr = msg.begin(); 
    itr != msg.end(); 
    ++itr) 
{ 
    std::cout << "Character '" << *itr << "' is the same as " 
       << static_cast<int>(*itr) << '\n'; 
} 
+0

Хорошо, у меня это в ascii и вы хотите преобразовать его в десятичную базу, но это, казалось, было в правильном направлении. Таким образом, я дал ему шанс, и это дало мне ошибку в том, что у меня не было компилятора на основе диапазона (htest.cpp: 18: 23: ошибки: диапазон на основе «для» не разрешен в режиме C++ 98) Любые предложения? – user2059300

+0

@ user2059300 [ASCII] (http://www.asciitable.com/) - это числовое представление в большинстве современных систем, и печать этих числовых значений будет производить, например, '65' для символа' 'A''. –

+0

@ user2059300 Что касается проблемы с итерацией, попросите компилятор использовать функциональность C++ 11 (для GCC/clang добавьте параметр '-std = C++ 11') или используйте обычные итераторы, как в моем обновленном ответе. –

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