2015-01-06 54 views
0

我試圖將C字符串轉換爲全部小寫字母,而不使用ctype.h中的tolower。 加強我的代碼似乎不工作:我收到一個運行時錯誤。我試圖做的是改變大寫字母bij'a' - 'A'的ASCII值,應該將這些值轉換爲小寫字母,只要我知道。將C字符串轉換爲全部較低

#include <stdio.h> 
void to_lower(char* k) { 
    char * temp = k; 
    while(*temp != 0) { 
     if(*temp > 'A' && *temp < 'Z') { 
      *temp += ('a' - 'A'); 
     } 
     temp++; 
    } 
} 

int main() { 
    char * s = "ThiS Is AN eXaMpLe"; 
    to_lower(s); 
    printf("%s",s); 
} 
+1

您收到的錯誤是什麼?看起來你在'to_lower'後面有一個額外的'}'。 – SimpleJ

+1

它也看起來像你正在修改一個未定義行爲的字符串文字。 –

+0

@SimpleJ:他沒有額外的'}',它只是未格式化的代碼。 –

回答

9

兩個錯誤。

此代碼不會轉換A和Z爲小寫:

if(*temp > 'A' && *temp < 'Z') { 

使用> =和< =代替。

嘗試修改字符串文字並不合法!數組可以被修改,字符串文字不能。

變化是char * s = "ThiS Is AN eXaMpLe";char s[] = "ThiS Is AN eXaMpLe";

+0

數組的內容可以修改。 –

+1

我想到一個數組作爲它的內容,僅此而已。它可以隱式轉換爲指針,但它與const指針確實不一樣。但我想這也是一種有效的方式。 – tux3

+0

@MooingDuck在某些情況下,字符串文字將位於只讀程序存儲器中。試圖在這種情況下修改它會導致程序崩潰。我在編寫AVR微控制器時遇到了這個問題 – SimpleJ

0

兩個,我馬上就可以看到問題:(1)char *s = "This..."創建一個不可寫的字符串。您需要使用字符數組並將字符串複製到其中。 (2)if (*temp > 'A' && *temp < 'Z')跳過A和Z.您需要>=<=

1

即使您不使用現有的標準庫函數,它仍然可能有用,請遵循其界面。 tolower轉換個人角色。將此函數應用於字符串可以寫爲解耦函數。

#include <stdio.h> 
#include <string.h> 

int to_lower (int c) { 
    if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c)) 
     c = c - 'A' + 'a'; 
    return c;   
} 

void mapstring (char *str, int (*f)(int)) { 
    for (; *str; str++) 
     *str = f(*str); 
} 

int main() { 
    char s[] = "THIS IS MY STRING"; 

    mapstring(s, to_lower); 
    printf("%s\n", s); 
    return 0; 
} 
+0

這個問題的第一行明確表示,它試圖做到這一點,「不使用ctype.h中的tolower」。 – tux3

+0

@ tux3謝謝。我已經重寫了我的建議。關鍵在於分離功能,不僅僅是重用圖書館,而是模仿它。 –