2014-11-06 83 views
3

我有一个结构:如何将字符串(字符*)转换为大写或小写用C

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

和功能将字符串转换为大写:

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

,并在我的主要功能I值分配到结构成员,并希望姓转换为大写:

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

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

+0

有什么不对的,你有什么? – 2014-11-06 18:41:17

+7

'“bob”'是只读位置中的字符串文字。你不能修改它。复制并修改它。 – Mahesh 2014-11-06 18:41:49

+0

问题是把''bob' - 一个常量字符串 - 赋值给'char *'类型的'surname'。你至少应该得到一个警告,你忽略了赋值中的const'ness 。总是使用完整的警告。解决这个问题的一种方法是通过运行'char * strdup(const char s)'作为赋值的一部分,然后获得可以修改的'char *'。不要忘记释放内存当你通过时。 – 2014-11-06 18:43:06

回答

3

您的toUpper()实施应该正常工作。但是,你应该注意你的编译器的警告(或者如果你没有得到任何警告 - 如果你把字符串字符串赋值为char *那么你应该看到一些东西)。字符串文字是const,即它们不能被修改。当您尝试写入它们时,这会导致您看到的分段错误。

你需要的东西,如:

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

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

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

,当然还有,可以肯定以后调用free(),无论哪种方式。

+0

字符串文字在C中不是'const'。我认为这样定义它是错误的,但不幸的是它是如此。所以OP不会得到警告。在gcc上你可以强制警告在这种情况下,程序违反了标准,但这样做更好。 – 2014-11-07 13:32:45

+0

@tristopia:我确信他们是,但我看了一下,你绝对正确。说修改它们是不确定的行为,这引发了他们为什么不这样做的问题......但是,所以没有明显的w从此开始。 – FatalError 2014-11-07 15:13:54

1

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

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

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

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

文字是不可写的,在第二种情况下,你显示它不是可写的文字,而是'hw'的内容。 – alk 2014-11-06 18:44:27

+0

@alk这是因为它不是一个文字;我知道。我用这种稍微不正确的方式写出了答案,因为它比正确的版本更简单,更容易理解。 – fuz 2014-11-06 18:49:03

+1

在这两种情况下''你好,世界!“**是**文字。在这两种情况下,它都是**不可写的。 – alk 2014-11-06 18:51:45

0

转换char *在C大写或小写的最简单的方法,就是使用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); 
} 
相关问题