2011-11-18 18 views
1

我有2個功能:
- stringCopy()該參數strToCopy複製到另一個字符串動態分配的應用的sanitize(見第2個功能)
- _sanitized()它返回一個動態分配的大寫的版本的參數並刪除非字母字符(如數字值&空格)。動態C字符串(字符*)怪異的行爲

考慮到以下情況,我得到了EXC_BAD_ACCESS,因爲k增長太多。

char* _sanitized(const char* str) 
{ 
    char* uppercasedStr = malloc(sizeof str); 

    int k = 0; // Index de parcours de la chaîne originale 
    int i = k; // Index dans la nouvelle chaîne 
    char evaluatedChar; 
    while ((evaluatedChar = str[k]) != '\0') 
    { 
     if ('A' <= evaluatedChar && evaluatedChar <= 'Z') 
     { 
      uppercasedStr[i] = evaluatedChar; 
      i++; 
     } 
     else if ('a' <= evaluatedChar && evaluatedChar <= 'z') 
     { 
      uppercasedStr[i] = evaluatedChar-32; 
      i++; 
     } 

     k++; 
    } 
    i++; 
    uppercasedStr[i] = '\0'; 

    return uppercasedStr; 
} 


char* stringCopy(char* strToCopy) 
{ 
    char* uppercaseStr = _sanitized(strToCopy); 

    char* copiedStr = malloc(sizeof uppercaseStr); 

    int k = 0; 
    while (uppercaseStr[k] != '\0') 
    { 
     copiedStr[k] = uppercaseStr[k]; 
     k++; 
    } 
    k++; 
    copiedStr[k] = '\0'; 

    free(uppercaseStr); 

    return copiedStr; 
} 

我也注意到,當我複製焦炭從uppercaseStrcopiedStr它修改的同時造成溢出uppercaseStr ...

+1

不應'malloc(sizeof str)'是'malloc(strlen(str))'? –

+2

@Neel Basu在這種情況下,使用strlen(str)+ 1 – nos

+2

每個人都在我後面重複:sizeof!= strlen –

回答

6

我看到的錯誤是在這裏:

char* uppercasedStr = malloc(sizeof str); 

您不能使用sizeof()來獲取字符串的長度。您需要使用strlen()

char* uppercasedStr = malloc(strlen(str) + 1); // Need +1 for terminating null 

這是同樣的錯誤的其他發生:

char* copiedStr = malloc(sizeof uppercaseStr); 

應該是:

char* copiedStr = malloc(strlen(uppercaseStr) + 1); 

sizeof(str)只給你一個char的大小指針,而不是整個c字符串的長度。

另請注意,我省略了sizeof(char)。這是因爲sizeof(char)在C中定義爲1,所以不需要。

+0

對。 'sizeof str'給你指針的大小,而不是任何與字符串長度有關的東西。 –