在C中将字符指针转换为大写

时间:2016-02-06 01:31:30

标签: c string pointers

我有一个指针:

char * name;

它包含字符串"test:case"

我正在用它调用另一个函数,并试图将它存储在一个结构中。但是,我想首先将整个字符串大写,但它似乎不起作用。

void func(char * name) {
    int i;
    List * l;

    l = malloc(sizeof(List));

    for(i=0; i< strlen(name); i++) {
        name[i] = toupper(name[i]);
    }

    l->name = name;
    //CALL A FUNCTION TO LATER FREE ALLOCATED MEMORY
}

List is a struct that has a member (char *) named name. 然而,这是seg故障。在我的情况下,我无法使用非指针。因为我必须使用指针而不是字符数组,所以我试图在char指针的每个值中使用toupper,但是这似乎不起作用。

4 个答案:

答案 0 :(得分:1)

您正在获得段错误,因为原始字符串可能是字面值,并且它不可修改。你需要先复制它。

.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))

请注意,当您稍后免费void func(char * name) { List * l; l = malloc(sizeof(List)); name = strdup(name); // make a copy of name for (char *p = name; *p; p++) { *p = toupper(*p); } l->name = name; } 时,您首先需要免费l

答案 1 :(得分:0)

由于您只将指针l->name设置为name,因此当原始name不再存在(也许它只在堆栈上?)和{{ 1}}被访问。您需要l->name空格malloc()的大小,复制strlen(name)+1并将name设置为该地址。

答案 2 :(得分:0)

您已分配了List,但未分配名称字符串本身。 你需要这样做:

l=malloc(sizeof(List));
l->name=(char*)malloc(strlen(name)+1); // You need to cater for the the final null char.

您的代码还有一些其他问题,这里是正确的(没有编译它,可能接近正常):

void func(char *name) {
  List * l;
  l = (List*)malloc(sizeof(List));
  l->name = (char*)malloc(strlen(name)+1);
  for(char *r=name, char *w=l->name; *r; ++r,++w) {
     *w = toupper(*r);
  }
  *++w='\0';
}

并且在每次迭代时,此代码都不会一次又一次地评估strlen,这将是非常糟糕的。

答案 3 :(得分:0)

代码中有两个错误。

char * name

变量 name 包含指向字符串的指针(即 char 的数组)。 当你这样写:

name[i] = toupper(name[i]);

如果它不是指向常量字符串的指针,那么您正在更改字符串的原始 char itens。如果是这种情况,那就是分段错误。

另一个错误在于:

 l->name = name;

您只是在结构中为变量指定通过变量 name 传递给函数的指针。你应该复制一份,如下:

strcpy(l->name, name);

此函数将第二个参数中的所有内容复制到第一个参数。

但这不是一个好的解决方案。如果 name 包含指向常量字符串的指针,则它仍然是分段错误。

我会重写你的代码:

void func(char * name) {
    int i;
    List * l;

    l = malloc(sizeof(List));

    char *buffer[strlen(name)]; //buffer of the contents pointed by *name* to upper case, initialized as empty string

    for(i=0; i< strlen(name); i++) {
        buffer[i] = toupper(name[i]);
    }
    buffer[i] = '\0'; //closing the string in i = strlen(name)

    strcpy(l->name, buffer);
    //CALL A FUNCTION TO LATER FREE ALLOCATED MEMORY
}

这样,您可以操作原始字符串的副本,而不是将缓冲区的副本复制到结构中的变量。

如果你这样做:

l->name = buffer;

你只是复制一个本地指针,它将在函数结束时消失。

我建议你在C中学习更多关于指针,数组和字符串的知识。本质上,字符串是一个char数组,在最终位置有一个'\ 0'。空字符串 s 在s [0]中有'\ 0'。

编辑:如果您习惯于制作字符串副本的语言:

string1 = string2

你应该始终记住,在C中,那是指针赋值。所以,在C中,代码必须这样编写:

strcpy(string1, string2);

希望有所帮助。