我有两个函数:
- stringCopy()将参数复制strToCopy到动态分配的另一个字符串中应用一个sanitize(参见第二个函数)
- _sanitized()它返回一个动态分配的大写参数并删除非字母char(如数值和空格).
考虑到以下因素,我得到了一个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;
}
Run Code Online (Sandbox Code Playgroud)
我还注意到,当我将char复制uppercaseStr到其中时会同时copiedStr修改uppercaseStr导致溢出的...
我看到的错误在这里:
char* uppercasedStr = malloc(sizeof str);
Run Code Online (Sandbox Code Playgroud)
你不能sizeof()用来获得字符串的长度.你需要使用strlen():
char* uppercasedStr = malloc(strlen(str) + 1); // Need +1 for terminating null
Run Code Online (Sandbox Code Playgroud)
这是同一个错误的另一个出现:
char* copiedStr = malloc(sizeof uppercaseStr);
Run Code Online (Sandbox Code Playgroud)
应该:
char* copiedStr = malloc(strlen(uppercaseStr) + 1);
Run Code Online (Sandbox Code Playgroud)
sizeof(str)只给出char指针的大小,而不是整个c-string的长度.
还要注意我省略了sizeof(char).这是因为sizeof(char)在C中定义为1.因此不需要它.