如何在c中链接列表中的所有字符串大写?

时间:2018-04-06 03:21:22

标签: c

我正在尝试将链接列表中的所有字符串大写,但我遇到了一个我无法弄清楚的分段错误。

这是我到目前为止的代码:

wordnode_t *upperAll(wordnode_t * indexWords){
    wordnode_t *upperIndexWords = NULL;
    wordnode_t *ptr = indexWords;
    while(ptr){
        char *word = ptr -> w;
        int i = 0;
        for (i=0; word[i]; i++){
            word[i] = toupper((unsigned char)word[i]);
            }
        upperIndexWords = add_end(indexWords, new_word(word, 0));
        ptr = ptr -> next;
    }
    return upperIndexWords;
}

wordnode_t是链表中的节点,w是节点中的字符串。

1 个答案:

答案 0 :(得分:1)

当您尝试读取或写入尚未分配给程序或不可写的地址时,会出现分段错误。很明显,你的程序试图读取未分配或无法访问的内存。我相信你的wordnode_t看起来像这样:

struct wordnode_t{
    char *w;
    wordnode_t *next;
}

在这种情况下,你得到段错误,因为这个word[i] = ...试图直接修改指向字符串文字char *word = ptr->w的指针,这是不允许的,或者只是不可修改。

我的解决方案是复制ptr->w,而不是为其指定另一个名称并尝试修改它。非常喜欢这个

char *word = strdup(ptr->w);
int i = 0;
for (i; word[i]; i++) {
    if (islower(word[i]))
        word[i] = toupper((unsigned char) word[i]);
    i++;
}

或者,如果你像我一样,不喜欢使用那么多的功能,

char *str = strdup(word);
int i = 0;
while (str[i]) {
    if (str[i] >= 97 && str[i] <= 122) 
        str[i] -= 32;
    i++;
}

如果您正在寻找标准方式,请避免strdup并且更加大胆。使用malloc

#include <string.h>

...

char *word = (char*)malloc(strlen(ptr->w) * sizeof(char));;
strcpy(word, ptr->w);
int i = 0;
for (i; word[i]; i++) {
    if (word[i] >= 97 && word[i] <= 122)
        word[i] -= 32;
}

完成后不要忘记free(word)

我希望这会有所帮助。