简体   繁体   中英

C++, Text to ASCII while-loop error

I've come this far without asking for help, but I've got a problem that I can't seem to fix. I like cryptology, so now that I am learning C++, I want to make programs to encrypt and decrypt strings. I read that the best way is to convert the text to ASCII and go from there, so here is a simple program I made in C++ to try and convert a char variable to 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;
}

So, I've tried all 3 things I know to do to troubleshoot (Google, check for missing simicolons, and make sure I'm doing == not =, but this is just something I don't know how to do, not something I'm forgetting (I hope). So, any help would great!

You don't have to change the characters to ASCII they already are. Chars are basically the same as integers in memory.

Now to your question; . If you want to set a character in a string you can do that like this

string[index] = b;

Another thing to be careful for in your code. You are using cin to read the string from the user. This will not let you read messages that have spaces in them and will only read the first word. For example, if the user enters "Love Crypto" cin will only read "Love" and "Crypto" will be ignored. To get the entire line, use getline instead.

As for looping over characters in a string, it's better to do it as follows:

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

Again, you're code isn't actually doing anything. It is only reading a letter and then storing a "letter" in another string.

string::at() throws exception if the index passed to at() is out of range. So, if you are getting runtime error then it's expected. Because, your string strEncrypt is initialized to "" and thus the size is 0.

You may try

strEncrypt.reserve(strlen(strString));

Easiest way to actually make the code you have work is change this line strEncrypt.at(a) = b; to this strEncrypt += b; Which will add the characters to the empty string strEncrypt.

Your code doesn't make much sense though as char types are already ascii. You'll have to explain more about what kind of encrypting you are trying to do and maybe we can point you in the right direction.

EDIT: After thinking about what you're trying to do a bit more based on the code you have it seems like you want to print the numeric ascii value of characters. You can do that with just a cast like this:

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;

}

On top of the fact that your input is already in ASCII, keep in mind that doing cin >> strString[1000] doesn't limit the input captured to the length of your buffer unless you specifically specify the number of characters to capture for the stream object using setw() or setting it's ios_base::width data member. So your method right now risks buffer overflows.

Secondly, the form of cin >> that you're using will not capture the entire line of input. Instead it will stop at the first white-space or any other delimiting character (or end-of-file if that is reached first). In your case, if you are entering a line like "Hello World", then the syntax you're using will only capture "Hello" and drop "World".

A much better idea would be to use the getline() function with a std::string object if you are wanting to capture a line of input to a string and remove the delimiting newline character without risking buffer overflows... for instance:

string strString;
getline(cin, strString);

Apart from advises given, when receiving this kind of run-time errors use Cppcheck utility. It will give you the answer: "Message: Array 'strString[1000]' index 1000 out of bounds".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM