2016-11-17 31 views
0

嘿,我有一個任務,我似乎無法解決。我得到一個char *字符串,我需要使用位操作將所有大寫字母(所有內容都以ASCII格式)轉換爲小寫字母。我添加了我的代碼,但它不斷崩潰。C++如何更改char *中for循環中的字符

#include <iostream> 
#include <cstring> 

using namespace std; 

void convertToLower(char* string) 
{ 
    for (unsigned int i = 0; i < strlen(string); i++) 
    { 
     if (string[i] >= 65 && string[i] <= 90) 
     { 
      string[i] |= 32; 
     } 
    } 
    cout << string << endl; 
} 
int main() 
{ 
    convertToLower("Hello"); 
    return 0; 
} 
+0

你是怎麼稱呼它的?你傳遞給它什麼? – molbdnilo

+0

http://ideone.com/53laPq對我來說都很好。你可能通過提供一個字符串來調用它,不要這樣做。這是隻讀內存。 –

+0

還要確保您的字符串以空字符結尾。 – SingerOfTheFall

回答

3

你試圖修改字符串字面即只讀存儲器:這對你的崩潰(或不確定的行爲更精確)

void convertToLower(char* str) 
{ 
    for (unsigned int i = 0; i < strlen(str); i++) 
    { 
     if (str[i] >= 65 && str[i] <= 90) 
     { 
      str[i] |= 32; 
     } 
    } 
    cout << str << endl; 
} 

int main() { 

    char arr[] = "STRING"; 
    convertToLower(arr); // Fine 

    char *readonly = "READONLY"; 
    convertToLower(readonly); // Nope 
} 

的原因,我想最近的編譯器會也已經警告過你(Wwritable-strings)。

此處詳細瞭解此問題:Why are string literals const?

+0

它的作品可以請你給我一個指導整個'*'的意思? – Rokni

+0

@Rokni添加了一個鏈接,以防您想要了解更多關於字符串文字以及爲什麼它們是隻讀的 –

+0

非常感謝 – Rokni

2
convertToLower("Hello"); 

"Hello"const char[]類型。從const char*char*的轉換從C++ 11開始就是非法的,所以如果你使用現代的編譯器,那麼你的編譯器應該告訴你一些事情,至少是一個警告。您不能覆蓋只讀存儲器(const)。試圖這樣做會導致未定義的行爲。製作它的副本並將其傳入:

char copy[] = "Hello"; 
convertToLower(copy); 
+0

謝謝,即時通訊使用VS 2015並沒有任何警告:) – Rokni