我有一个结构:
typedef struct entry {
char *surname;
int house_no;
char *postcode;
} BEntry;
和将字符串转换为大写的函数:
void toUpper(char *str){
while (*str != '\0')
{
*str = toupper(*str);
str++;
}
}
在我的main函数中,我将值赋给struct成员,并希望将姓氏转换为大写:
mentry->surname = "bob";
mentry->house_no = 17;
mentry->postcode = "GK116BY";
toUpper(me->surname);
通过将char指针传递给这样的函数,将字符串转换为大写的正确方法是什么?我的程序正在返回分段错误。非常感谢任何帮助,谢谢。
答案 0 :(得分:3)
您的toUpper()
实施应该可以正常运行。但是,您应该注意编译器的警告(或者如果您没有得到任何警告级别,那么当您将字符串文字分配给char *
时,您应该看到一些警告级别) 。字符串文字是const
,即它们不能被修改。当您尝试写入它们时,这将导致您看到的分段错误。
您需要以下内容:
mentry->surname = malloc(4);
strcpy(mentry->surname, "bob");
或更方便,但不是C标准方式的一部分:
mentry->surname = strdup("bob");
当然,无论如何,请务必稍后致电free()
。
答案 1 :(得分:1)
像"Hello, World!"
这样的字符串文字是不可写的。复制字符串文字:
hw = strdup("Hello, World!");
或声明一个char[]
变量并将其初始化为字符串文字。作为一种特殊情况,使用这种方式的字符串文字是可写的:
char hw[] = "Hello, World!";
答案 2 :(得分: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);
}