2016-04-25 19 views
1

我只是編寫程序。我試着用指針來做。它是從大寫變爲小寫的程序,沒有來自函數參數的索引。問題是不斷變化的價值,我的程序崩潰那裏......如何用指針更改數組中的值?

#include <iostream> 
#include <cstring> 

using namespace std; 

char* male(char* nap, int n) { 
    for (int i = 0; i < 9; ++i) { 
     if (i != n && ((*nap >= 'A') && (*nap <= 'Z'))) { 
      *nap = (char)(*nap+32); 
     } 
     nap++; 
    } 
    return nap; 
} 

int main() { 

    char * nap = "aBCDEFGHI"; 
    male(nap, 2); 

    return 0; 
} 

你能告訴我,爲什麼*nap = (char)(*nap+32);不是一個好辦法?

+0

因爲它生病了 – 2016-04-25 19:15:50

+2

爲什麼你不能使用'std :: tolower'? – ArchbishopOfBanterbury

+0

@ Dr.Jones:這有什麼不妥? –

回答

2

這是C++代碼,以便執行以下操作:

char * nap = "aBCDEFGHI"; 

應該是

const char * nap = "aBCDEFGHI"; 

因爲字符串文字中C是常量++。所以你的代碼:

*nap = (char)(*nap+32); 

也是未定義行爲,這可能導致崩潰。


最小的變化,除去UB是定義nap爲數組:

char nap[] = "aBCDEFGHI"; 
+0

它可以嗎?它會!我還沒有看到代碼在任何地方工作 – 2016-04-25 19:20:46

+0

謝謝,我改變了我的字符串。 –

+0

@ Dr.Jones:「可以」是正確的。永遠不要依賴任何UB的任何影響。 –

2

你的編譯器應該抱怨這行的......

char * nap = "aBCDEFGHI"; 

你的主要問題是,您正試圖在運行時修改字符串文字。它的Undefined Behavior這樣做。請參閱Why is this string reversal C code causing a segmentation fault?

answer說明您的解決方法。

你能告訴我爲什麼*nap = (char)(*nap+32);不是一個好方法嗎?

它本身並不全是壞的。但你可以惹上麻煩...這條線是有效的......

*nap = *reinterpret_cast<char*>(const_cast<char*>(nap+32)); 

C風格演員陣容是一個無情的演員。正如你所看到的,你也拋棄了所有const和/或volatile資格...有些代碼庫會受到傷害,特別是如果對象被存儲在只讀標記的內存中...請參閱When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?