2011-08-10 80 views
0

我已經到目前爲止沒有尋求幫助,但我有一個問題,我似乎無法修復。我喜歡密碼學,所以現在我正在學習C++,我想製作程序來加密和解密字符串。我看,最好的辦法是將文本轉換爲ASCII,並從那裏走,所以這裏是一個簡單的程序,我在C++中作出嘗試和字符變量轉換爲ASCII:C++,文本到ASCII while循環錯誤

#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,並確保我在做==不=,但這只是我不知道該怎麼做,而不是我忘記的東西(我希望)。因此,任何幫助會很大!

+1

請參閱下面的答案ASCII的東西。除此之外,該cin >>行沒有做你想做的事。相反,嘗試cin.getline(strString,1000)。 如果您認真對待C++,我建議您做一些簡單的教程,並拿起一本像「C++編程語言」這樣的書籍作爲參考。 :) – mwd

回答

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; 

} 
+0

感謝您在代碼中留下評論,以便我能理解它! –

2

string::at()拋出異常,如果傳遞給at()指數超出範圍。所以,如果你正在運行時錯誤,那麼它的預期。因爲,你的字符串strEncrypt被初始化爲""因而大小爲0

您可以嘗試

strEncrypt.reserve(strlen(strString)); 
4

您不必更改字符爲ASCII他們已經是。字符基本上與記憶中的整數相同。

現在你的問題; 。如果你想設置一個字符串中的字符,你可以這樣做

string[index] = b; 

在代碼中另一件要小心的事情。您正在使用cin來讀取用戶的字符串。這不會讓你閱讀其中有空格的消息,只會閱讀第一個單詞。例如,如果用戶輸入「Love Crypto」cin將只會讀取「Love」並且「Crypto」將被忽略。要獲得整條生產線,請改爲使用getline

至於字符串中的遍歷字符,最好如下做到這一點:

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

同樣,你的代碼實際上沒有做任何事情。它只讀取一個字母,然後在另一個字符串中存儲"letter"

+0

感謝您解決這個問題,它現在正在工作。幫助非常感謝! –

+0

string.at不是'讀取函數',http://www.cplusplus.com/reference/string/string/at/。 OP的問題在於他正在使用越界索引。 – john

0

論事實頂部,你的輸入已經在ASCII,請記住,這樣做cin >> strString[1000]不限制捕捉到你的緩衝區長度的輸入除非您特別指定要使用setw()或將其設置爲ios_base::width數據成員來爲流對象捕獲的字符數。所以你的方法現在有風險緩衝區溢出。

其次,您使用的形式cin >>不會捕獲整個輸入行。相反,它會停在第一個空格或任何其他分隔字符處(或者如果是第一個到達文件結尾)。在你的情況下,如果你正在輸入一個類似「Hello World」的行,那麼你使用的語法只會捕獲「Hello」並放棄「World」。

一個更好的想法是,如果你是想捕捉線路輸入的字符串並刪除劃定換行符,而不用擔心緩衝區溢出使用getline()功能與std::string對象...例如:

string strString; 
getline(cin, strString); 
0

除了給出的建議,當收到這種運行時錯誤使用Cppcheck實用程序。 它會給你答案:「消息:數組'strString [1000]'索引1000越界」。