2015-01-11 69 views
-1

以下代碼將字符串中的所有小寫字符轉換爲大寫。但是,它不會用計算的大寫字符替換小寫字符。字符數組分配不工作

static char * strtoupper(char * string, int size) 
{ 
char c; 
for(int i = 0; i< size; i++) 
{ 
    if(islower((int) (*string)) != 0) 
    { 
     c = (char) toupper(*string); 
     *string = c; 
    } 
    ++string; 
} 
return string; 
} 
+1

爲什麼你測試'islower判斷()'有效?和'* string = toupper(* string);''應該沒問題。 –

+0

請發佈[MCVE](http://stackoverflow.com/help/mcve)。 – juanchopanza

+2

提示:「字符串」在增加大小後指向什麼? – hvd

回答

3

您返回遞增的指針,你不需要任何回報,只需要修改到位

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

的字符串,如果你想通過字符串的長度,如果例如,它不是空終止

void strtoupper(char *string, size_t size) 
{ 
    size_t i; 
    for (i = 0 ; i < size ; ++i) 
     string[i] = toupper(string[i]); 
} 
+1

顯然,將字符串指針返回給被調用函數的期望目標不是必需的。有人想知道爲什麼它首先在OP的代碼中出現。 – WhozCraig

-3
while (*string++ = toupper(*string)); 
+1

該解決方案不考慮序列點並導致UB。 – glglgl

+1

即使沒有,它也不會回答這個問題。 – hvd

+0

UB與否,這是難以閱讀的,這使得它容易出錯。無需像這樣編碼。我懷疑這會通過代碼審查。 – alk

1

要考慮到你的函數的n次後返回一個指針(TH在大小)元素,通常情況下可以是終止零。

我會寫的函數通過以下方式

static char * strtoupper(char *string, size_t size) 
{ 
    for(size_t i = 0; i < size; i++) 
    { 
     if(islower((unsigned char)string[i])) 
     { 
      string[i] = toupper((unsigned char)string[i]); 
     } 
    } 

    return string; 
} 

你也可以不通過一個字符串的函數作爲參數,因爲您可能沒有修改字符串文字。任何修改字符串文字的嘗試都會導致程序未定義的行爲。

因此,例如函數的此調用無效

strtoupper("Hello", 5); 

但這

char s[] = "Hello"; 

strtoupper(s, strlen(s));