我编写了一个函数来将字符串中的所有字母转为大写,但由于某种原因,当我在证据文件中使用它时,它给了我一个“总线错误”。谁能解释一下这是什么意思?
这是函数
void make_capital(char *s)
{
int i;
for(i = 0 ; i < strlen(s) ; i++) {
if(('a' <= s[i]) && (s[i] <= 'z')) {
s[i] -= 32;
}
}
}
这是我在证据文件中使用它的方式
char* capital_test = malloc(8);
capital_test = "abCdEfG";
make_capital(capital_test);
printf("%s\n", capital_test);
最佳答案
这是错误的
capital_test = "abCdEfG";
如果您在 malloc()
之后和此赋值之前打印 capital_test
指向的地址,您会注意到它发生了变化。
您正在修改字符串文字,这会导致未定义的行为,当您执行上面的分配时,与c中的许多其他语言不同,您也不会修改指针指向的内容,而是使指针指向字符串字面意思。
然后将该指针传递给函数,而不是修改新分配的内存,而是修改字符串文字。
您应该复制字符串的内容,您可以编写一个循环并复制每个字符,或者您可以使用标准函数 strcpy()
,尽管此函数需要包含 string.h
header 。
所以要解决这个问题,你应该
char *capital_test = malloc(8);
if (capital_test == NULL)
return -1; /* allocation error, you can't continue */
strcpy(capital_test, "abCdEfG");
此外,可以在不使用 strlen()
的情况下编写 for 循环,因为您将遍历字符串中的所有字符,因此这样
for (i = 0 ; s[i] != '\0' ; ++i)
会做同样的事情,而无需在每次迭代中使用strlen()
。
最后,您可以使用 ctype.h
中的 toupper()
函数,因此您的循环将非常简单
for (i = 0 ; s[i] != '\0' ; ++i)
s[i] = toupper(s[i]);
还有一件事:当您使用 malloc()
时,如果此代码仅用于演示,则必须使用 free()
或您不需要当前函数之外的字符串,您可以使用数组而不是指针,因为当您将数组传递给函数时,它的行为与指针完全相同,并且就像简单的
char capital_test[] = "abCdEfG";
这会将 capital_test
初始化为字符串,并包括 nul
终止字节,因此如果您尝试更改它,将会是安全的,因为它不是指向字符串的指针文字,而是一个数组。
关于C:Make Capital 功能的总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28775463/