C ++, текстовая ошибка ASCII во время цикла - PullRequest
0 голосов
/ 10 августа 2011

Я зашел так далеко, не обращаясь за помощью, но у меня есть проблема, которую я не могу решить. Мне нравится криптология, поэтому теперь, когда я изучаю C ++, я хочу создавать программы для шифрования и дешифрования строк. Я прочитал, что лучший способ - это преобразовать текст в ASCII и перейти оттуда, поэтому вот простая программа, которую я сделал на C ++, чтобы попытаться преобразовать переменную char в ASCII:

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int main()
{
    char strString[1000];
    cout<<"Enter you message:"<<endl;
    cin>>strString[1000];
    string strEncrypt;
    int a = 0;

while (strString != '\0')
{
    int b = (int)strString[a];
    strEncrypt.at(a) = b;  //This is where I'm getting an error.
    a++;
}

cout<<"Encrypted message:"<<endl;
cout<<strEncrypt<<endl;
}

Итак, я попробовал все 3 вещи, которые я знаю сделать, чтобы устранить неполадки (Google, проверьте наличие недостающих символов, и убедитесь, что я делаю == не =, но это просто то, что я не знаю как делай, не то, что я забыл (надеюсь). Так что любая помощь будет великолепна!

Ответы [ 5 ]

4 голосов
/ 10 августа 2011

Вам не нужно менять символы на ASCII, которыми они уже являются. Символы в основном совпадают с целыми числами в памяти.

Теперь к вашему вопросу; , Если вы хотите установить символ в строке, вы можете сделать это следующим образом

string[index] = b;

Еще одна вещь, к которой следует быть осторожным в вашем коде. Вы используете cin для чтения строки от пользователя. Это не позволит вам читать сообщения, в которых есть пробелы, и будет читать только первое слово. Например, если пользователь вводит «Love Crypto», cin будет читать только «Love», а «Crypto» будет игнорироваться. Чтобы получить всю строку, используйте getline.

Что касается зацикливания символов в строке, лучше сделать это следующим образом:

for(int i = 0; i < strString.length(); i++)
{
    strString[i] = bla;
}

Опять же, ваш код ничего не делает. Он только читает письмо, а затем сохраняет "letter" в другой строке.

2 голосов
/ 10 августа 2011

string::at() выдает исключение, если индекс, переданный в at(), находится вне диапазона. Итак, если вы получаете ошибку во время выполнения, то это ожидаемо. Потому что ваша строка strEncrypt инициализируется как "" и, следовательно, имеет размер 0.

Вы можете попробовать

strEncrypt.reserve(strlen(strString));
1 голос
/ 10 августа 2011

Самый простой способ заставить ваш код работать - это заменить эту строку strEncrypt.at(a) = b; на эту strEncrypt += b;, которая добавит символы в пустую строку strEncrypt.

Ваш код не имеет особого смыслахотя как типы символов уже ascii.Вам нужно будет объяснить больше о том, какой тип шифрования вы пытаетесь сделать, и, возможно, мы сможем указать вам правильное направление.в коде, который вы имеете, кажется, что вы хотите напечатать числовое значение ascii символов.Вы можете сделать это с помощью только такого броска:

string input;
cout << "Enter you message:" << endl;
// handle spaces in the message
getline(cin, input);

cout << "String chars as ascii values:" << endl;
cout << "Char:  " << "ASCII Code:" << endl;

for (int i = 0; i < input.length(); ++i)
{
    // casting the char to an int with (int) will print the ascii code
    cout << input[i] << "       " << (int)input[i] << endl;

}
0 голосов
/ 10 августа 2011

Помимо данных советов, при получении такого рода ошибок времени выполнения используйте утилиту Cppcheck .Он даст вам ответ: «Сообщение: массив 'strString [1000]', индекс 1000 вне границ".

0 голосов
/ 10 августа 2011

В дополнение к тому факту, что ваш ввод уже находится в ASCII, имейте в виду, что выполнение cin >> strString[1000] не ограничивает вводимый ввод длиной вашего буфера, если вы не укажете определенное количество символов для захвата для потока.объект, используя setw() или установив ios_base::width элемент данных.Таким образом, ваш метод прямо сейчас рискует переполнением буфера.

Во-вторых, используемая вами форма cin >> не захватит всю строку ввода.Вместо этого он остановится на первом пробеле или любом другом символе-разделителе (или конце файла, если он достигнут первым).В вашем случае, если вы вводите строку наподобие «Hello World», то используемый вами синтаксис будет захватывать только «Hello» и опускать «World».

Гораздо лучшая идея - использоватьФункция getline() с объектом std::string, если вы хотите захватить строку ввода в строку и удалить символ новой строки без разделителей, не рискуя переполнением буфера ... например:

string strString;
getline(cin, strString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...