2014-11-06 80 views
3

我有一個結構:如何將字符串(字符*)轉換爲大寫或小寫用C

typedef struct entry { 
char *surname; 
int house_no; 
char *postcode; 
} BEntry; 

和功能將字符串轉換爲大寫:

void toUpper(char *str){ 
    while (*str != '\0') 
    { 
     *str = toupper(*str); 
     str++; 
    } 
} 

,並在我的主要功能I值分配到結構成員,並希望姓轉換爲大寫:

mentry->surname = "bob"; 
mentry->house_no = 17; 
mentry->postcode = "GK116BY"; 
toUpper(me->surname); 

什麼是CONVER的正確方法通過將字符型指針傳遞給像這樣的函數來將字符串轉換爲大寫字母?我的程序正在返回一個分段錯誤。非常感謝任何幫助,謝謝。

+0

有什麼不對的,你有什麼? – 2014-11-06 18:41:17

+7

'「bob」'是隻讀位置中的字符串文字。你不能修改它。複製並修改它。 – Mahesh 2014-11-06 18:41:49

+0

問題是把''bob' - 一個常量字符串 - 賦值給'char *'類型的'surname'。你至少應該得到一個警告,你忽略了賦值中的const'ness 。總是使用完整的警告。解決這個問題的一種方法是通過運行'char * strdup(const char s)'作爲賦值的一部分,然後獲得可以修改的'char *'。不要忘記釋放內存當你通過時。 – 2014-11-06 18:43:06

回答

3

您的toUpper()實施應該正常工作。但是,你應該注意你的編譯器的警告(或者如果你沒有得到任何警告 - 如果你把字符串字符串賦值爲char *那麼你應該看到一些東西)。字符串文字是const,即它們不能被修改。當您嘗試寫入它們時,這會導致您看到的分段錯誤。

你需要的東西,如:

mentry->surname = malloc(4); 
strcpy(mentry->surname, "bob"); 

或更方便,但不是C標準的方式部分:

mentry->surname = strdup("bob"); 

,當然還有,可以肯定以後調用free(),無論哪種方式。

+0

字符串文字在C中不是'const'。我認爲這樣定義它是錯誤的,但不幸的是它是如此。所以OP不會得到警告。在gcc上你可以強制警告在這種情況下,程序違反了標準,但這樣做更好。 – 2014-11-07 13:32:45

+0

@tristopia:我確信他們是,但我看了一下,你絕對正確。說修改它們是不確定的行爲,這引發了他們爲什麼不這樣做的問題......但是,所以沒有明顯的w從此開始。 – FatalError 2014-11-07 15:13:54

1

"Hello, World!"這樣的字符串文字是不可寫的。無論是複製字符串文字:

hw = strdup("Hello, World!"); 

或聲明char[]變量並將其初始化字符串文字。作爲一個特殊的情況下,用這樣的方式字符串文字寫的:

char hw[] = "Hello, World!"; 
+1

文字是不可寫的,在第二種情況下,你顯示它不是可寫的文字,而是'hw'的內容。 – alk 2014-11-06 18:44:27

+0

@alk這是因爲它不是一個文字;我知道。我用這種稍微不正確的方式寫出了答案,因爲它比正確的版本更簡單,更容易理解。 – fuz 2014-11-06 18:49:03

+1

在這兩種情況下''你好,世界!「**是**文字。在這兩種情況下,它都是**不可寫的。 – alk 2014-11-06 18:51:45

0

轉換char *在C大寫或小寫的最簡單的方法,就是使用strdup

#include <string.h> 

char *to_uppercase(char *s) 
{ 
    int i = 0; 
    char *str = strdup(s); 

    while (str[i]) 
    { 
     if (str[i] >= 97 && str[i] <= 122) 
      str[i] -= 32; 
     i++; 
    } 
    return (str); 
} 
相關問題