3

我有一个结构:

typedef struct entry {
char *surname;
int house_no;
char *postcode;
} BEntry;

以及将字符串转换为大写的函数:

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

在我的主要函数中,我为结构成员赋值,并希望将姓氏转换为大写:

mentry->surname = "bob";
mentry->house_no = 17;
mentry->postcode = "GK116BY";
toUpper(me->surname);

通过将 char 指针传递给这样的函数来将字符串转换为大写的正确方法是什么?我的程序返回分段错误。非常感谢任何帮助,谢谢。

4

3 回答 3

3

您的toUpper()实现应该可以正常工作。但是,您应该注意来自编译器的警告(或者如果您没有收到任何警告,请调高警告级别 - 当您将字符串文字分配给类似的内容时,您应该会看到一些东西char *)。字符串文字是const,即它们不能被修改。当您尝试写入它们时,这将导致您看到的分段错误。

你需要类似的东西:

mentry->surname = malloc(4);
strcpy(mentry->surname, "bob");

或更方便,但不是 C 标准方式的一部分:

mentry->surname = strdup("bob");

当然,无论哪种方式,请务必free()稍后致电。

于 2014-11-06T18:42:40.433 回答
1

像这样的字符串文字"Hello, World!"是不可写的。复制字符串文字:

hw = strdup("Hello, World!");

或声明一个char[]变量并将其初始化为字符串文字。作为一种特殊情况,以这种方式使用的字符串文字是可写的:

char hw[] = "Hello, World!";
于 2014-11-06T18:43:11.860 回答
1

在 c中转换char *为小写或大写的最简单方法是使用strdup

#include <string.h>

char    *to_uppercase(char *s)
{
    int i = 0;
    char    *str = strdup(s);

    while (str[i])
    {
        if (str[i] >= 97 && str[i] <= 122)
            str[i] -= 32;
        i++;
    }
    return (str);
}
于 2016-06-17T21:34:24.173 回答