C:Make Capital 功能的总线错误

标签 c

我编写了一个函数来将字符串中的所有字母转为大写,但由于某种原因,当我在证据文件中使用它时,它给了我一个“总线错误”。谁能解释一下这是什么意思?

这是函数

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/

相关文章:

c - opengl+glut glutPostRedisplay在哪里?

c - 解析 C 中的整数和字符数组

c - 函数局部的静态变量

c - 普通 C 的输入/输出流抽象层

c - 我在哪里可以找到 C 语言的移位指南?

在 C 中创建最大大小文件 : drive (OS drive) fails

c++ - (C) 我错过了这段代码吗?

c++ - 使用共享库与单个可执行文件

c - for 循环中 n * n * n 次迭代的时间复杂度是多少?

c - 在 C 中的 3D 线上查找点