如何在C中将字符串(char*)转换为大写或小写

如何在C中将字符串(char*)转换为大写或小写,c,pointers,char,tolower,toupper,C,Pointers,Char,Tolower,Toupper,我有一个结构: 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-&g

我有一个结构:

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);
在我的主函数中,我为结构成员赋值,并希望将姓氏转换为大写:

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指针,将字符串转换为大写的正确方法是什么?我的程序返回一个分段错误。非常感谢您的帮助。

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

你需要像这样的东西:

mentry->surname = malloc(4);
strcpy(mentry->surname, "bob");
或者更方便,但不是C标准方式的一部分:

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

当然,以后一定要调用
free()。复制字符串文字:

hw = strdup("Hello, World!");
或者声明一个
char[]
变量并将其初始化为字符串文本。作为一种特殊情况,以这种方式使用的字符串文本是可写的:

char hw[] = "Hello, World!";

将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);
}
#包括
char*到_大写字母(char*s)
{
int i=0;
char*str=strdup(s);
while(str[i])
{

如果(str[i]>=97&&str[i]您所拥有的有什么问题?
“bob”
是只读位置中的字符串文字。您无法修改它。请复制并修改它。问题是
“bob
--一个常量字符串--指向
姓氏
,其类型为
char*
。您至少应该得到一个警告,表明您忽略了赋值中的常量。始终使用完整警告。解决此问题的一种方法是运行
char*strdup(const char s)
作为作业的一部分。然后你会得到可以修改的“char*”。完成后别忘了释放内存。文字是不可写的,在第二种情况下,你会发现可写的不是文字,而是
hw
@alk的内容,因为它不是文字;我知道。我在这张幻灯片中写下了答案这是一种不正确的方式,因为它比正确的版本更容易理解和表达。在这两种情况下,
“Hello,World!”
都是一个文本。在这两种情况下,它都是不可写的。@alk从技术上讲是的,但这是一种特殊情况,字符串文本的内容隐式初始化数组(参考ISO 9899:2011§6.7.9.14)。从程序员的角度看,字符串文字实际上是可写的。我知道这不太正确,但更容易理解。字符串文字在C中不是
const
。我认为标准中这样定义它是错误的,但不幸的是,它是这样。因此OP不会得到警告。在gcc中,您可以强制警告f或者是
-Wwrite strings
,在这种情况下,程序违反了标准,但这样做更好。@tristopia:我想肯定是这样,但我看了一下,你完全正确。它确实说修改它们是未定义的行为,这就引出了一个问题,为什么它们不是…但是是的,所以没有明显的警告那好吧。