2012-09-06 58 views
1

我感覺好像這應該是非常基本的,但由於某種原因我卡住了。當在C中執行Rot13時崩潰

以下是我有:

char *rot13(char *s) 
{   
    char *p=s;   
    int upper; 

    while (*p) {  
     upper=toupper(*p);    
     if (upper >='A' && upper <= 'M') 
      *p+=13; 
     else if (upper>='N' && upper <= 'Z') 
      *p-=13; 
     ++p;  
    }  
    return s; 
} 

我不是一個C大師,但我比較肯定的是一些小事我似乎無法查明它。我得到的錯誤是,一旦擊中某一炭改性劑(*p+=13*p-=13)我得到「未處理的異常在############:訪問衝突寫入位置#####」

我在做什麼錯?

感謝

+1

要知道,你的函數將不會使用類似[EBCDIC](HTTP系統正常工作:// EN .wikipedia.org /維基/ EBCDIC#Codepage_layout)。從0到9的數字可以依賴於連續,但是字母不是。 – chris

+1

該函數看起來非常正確。你是怎麼稱呼這個功能的? –

+4

你傳遞的函數是一個常量字符串嗎? –

回答

8

你也許還稱rot13()用(指針)字符串字面量作爲實際參數? 字符串文字是隻讀的C.沿

試試
char foo[] = "YOUR STRING TO BE ROT13'D IN-PLACE."; 

rot13 (foo); 
+0

好吧,我覺得自己像一個白癡..我用char * test =「TEST」來調用它。 ROT13(測試)。它不是什麼id認爲字符串文字,但自從你的解決方案工作我很困惑?有人能告訴我爲什麼修復它嗎? –

+1

這是因爲char **數組**不是隻讀默認情況下(只有當你聲明它們爲'const foo [] =「...」;',而C標準明確地寫入字符串文字*未定義的行爲*(例外是一種允許的未定義行爲) – Jens

+1

您可能想閱讀[comp.lang.c FAQ](http://c-faq.com/),特別是第6節。 – pmg

1

像pmg說的,閱讀常見問題。以下示例可能有助於指導您朝着正確的方向發展。

下面是一個使用字符指針,而不是一個字符數組的例子:

char *foo = malloc(36); // 35 + 1 for ending '\0' 
strcpy(foo, "YOUR STRING TO BE ROT13'D IN-PLACE."); // requires #include <string.h> 
printf("%s\n", rot13(foo));