C ++,Text to ASCII while循环错误

时间:2011-08-10 03:44:33

标签: c++ encryption

我已经走到这一步而没有寻求帮助,但我遇到了一个我似乎无法解决的问题。我喜欢密码学,所以现在我正在学习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;
}

所以,我已经尝试了所有我要做的三件事来排除故障(谷歌,检查缺少的simicolons,并确保我在做==不=,但这只是我不知道怎么做做,不是我忘记的事情(我希望)。所以,任何帮助都会很棒!

5 个答案:

答案 0 :(得分:4)

您不必将字符更改为已有的ASCII字符。字符与记忆中的整数基本相同。

现在回答你的问题; 。如果你想在字符串中设置一个字符,你就可以这样做

string[index] = b;

在代码中要小心的另一件事。您正在使用cin来读取用户的字符串。这不会让您阅读其中包含空格的消息,只会读取第一个单词。例如,如果用户输入“Love Crypto”cin,则只会读取“Love”,而“Crypto”将被忽略。要获得整行,请改用getline

至于循环字符串中的字符,最好按如下方式进行:

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

同样,你的代码实际上并没有做任何事情。它只是读一个字母,然后将"letter"存储在另一个字符串中。

答案 1 :(得分:2)

如果传递给at()的索引超出范围,

string::at()会抛出异常。因此,如果您遇到运行时错误,那么它是预期的。因为,您的字符串strEncrypt已初始化为"",因此大小为0。

您可以尝试

strEncrypt.reserve(strlen(strString));

答案 2 :(得分:1)

实际制作您工作的代码的最简单方法是将此行strEncrypt.at(a) = b;更改为此strEncrypt += b;这将将字符添加到空字符串strEncrypt。

虽然char类型已经是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;

}

答案 3 :(得分:0)

除了您的输入已经是ASCII之外,请记住,除非您明确指定要捕获的字符数,否则执行cin >> strString[1000]不会将捕获的输入限制为缓冲区的长度。使用setw()或设置ios_base::width数据成员的流对象。所以你的方法现在冒着缓冲区溢出的风险。

其次,您正在使用的cin >>形式不会捕获整行输入。相反,它将停在第一个空格或任何其他分隔字符(如果首先到达,则为文件结尾)。在您的情况下,如果您输入的行如“Hello World”,那么您使用的语法只会捕获“Hello”并删除“World”。

如果您想要捕获字符串的输入行并删除分隔换行符而不会有缓冲区溢出的风险,那么更好的想法是将getline()函数与std::string对象一起使用。 ..例如:

string strString;
getline(cin, strString);

答案 4 :(得分:0)

除了给出的建议,当收到此类运行时错误时,使用Cppcheck实用程序。 它会给你答案:“消息:数组'strString [1000]'索引1000超出范围”。