我正在尝试将链接列表中的所有字符串大写,但我遇到了一个我无法弄清楚的分段错误。
这是我到目前为止的代码:
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是节点中的字符串。
答案 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)
。
我希望这会有所帮助。