2009-03-04 58 views
2

所以我有一個程序使char *的東西小寫。它通過遍歷和操作ascii來完成。現在我知道在C++中可能有一些這樣的庫,但那不是重點 - 我是一個試圖掌握char * s和東西的學生:)。編寫char *迭代時,「Debugger已經退出,因爲信號10」

這裏是我的代碼:

#include <iostream> 

using namespace std; 

char* tolower(char* src); 

int main (int argc, char * const argv[]) 
{ 
    char* hello = "Hello, World!\n"; 

    cout << tolower(hello); 
    return 0; 
} 

char* tolower(char* src) 
{ 
    int ascii; 
    for (int n = 0; n <= strlen(src); n++) 
    { 
     ascii = int(src[n]); 
     if (ascii >= 65 && ascii <= 90) 
     { 
      src[n] = char(ascii+32); 
     } 
    } 

    return src; 
} 

(這不是一個賦值;))

它建立正常,但是當我運行它,我得到一個「調試器已因信號退出10「,Xcode指向下面的行:」src [n] = char(ascii + 32);「

謝謝!

馬克

+0

n的值是多少? – 2009-03-04 22:27:29

+0

另外,轉換爲int並返回的思想過程是什麼?上次我檢查,char在C++中是一個數字類型。 – 2009-03-04 22:30:08

回答

9

Yowsers!

您的「Hello World!」字符串是所謂的字符串文字,這意味着它的內存是程序的一部分,不能被寫入。

您正在執行所謂的「就地」轉換,例如,而不是寫出小寫的版本到您正在寫入原始目的地的新緩衝區。由於目的地是文字,無法寫入您正在崩潰。

試試這個;

char hello[32]; 
strcpy(hello, "Hello, World!\n"); 

另外在你的循環,你應該使用<,不< =。 strlen返回一個字符串的長度減去它的空終止符,並且數組索引是從零開始的。

7

正如Andrew在代碼中指出"Hello World\n"是隻讀文字。您可以使用strcpy做出修改副本,要不試試這個:

char hello[] = "Hello, World!\n"; 

這會自動分配堆棧大到足以容納文字字符串的副本上一個陣列尾隨'\0',並複製文字進入陣列。

此外,您還可以一走了之ASCII作爲一個字符,並使用字符文字而不是中知道的'A'數值是:

char ascii; 
for (int n = 0; n < strlen(src); n++) 
{ 
    ascii = src[n]; 
    if (ascii >= 'A' && ascii <= 'Z') 
    { 
     src[n] = ascii - 'A' + 'a'; 
    } 
} 

當你在它,爲什麼用ASCII打擾在所有的,只是使用SRC [N]:

for (int n = 0; n < strlen(src); n++) 
{ 
    if (src[n] >= 'A' && src[n] <= 'Z') 
    { 
     src[n] -= 'A' - 'a'; 
    } 
} 

然後,你可以利用的事實,爲了確定C-字符串的長度,你無論如何都要迭代雖然,只是將兩者結合在一起:

for (char *n = src; *n != 0; n++) 
    if (*n >= 'A' && *n <= 'Z') 
     *n -= 'A' - 'a';