链接列表的字符数组 - 使用数组

时间:2015-06-28 00:44:29

标签: c arrays string linked-list

我正在尝试将字符串中的单词传递给链表,事实是,我无法将内存重新分配给我的结构中的字符串,我应该使用数组中每个单词的地址。 / p>

我的结构:

typedef struct slist{
    char *string;
    struct slist * prox;
} *SList;

我的职能:

int towords (char t[], SList *l){
    int i, p;
    p=0;
    *l = (SList) calloc(1, sizeof(struct slist));

    SList aux = NULL;


    SList li = *l;
    for(i=0; t[i]!='\0' ;){
        aux = (SList) calloc(1, sizeof(struct slist));

        li->string = &t[i];
        li->prox = aux;
        li = aux;

        while(t[i]!=' ') i++;

        //t[i++] = '\0'; -> this doesn't work, bus error 10;

        while(t[i]==' ') i++;

        p++; //This counts words
    }

    return p;

}

这是有效的,我的疑问是,我无法更改初始数组,在每个单词的末尾包含一个NULL char(在C中声明的字符串是只读的吗?)

所以,我试图添加t [i] =' \ 0'徒然。

此时,使用此字符串运行代码

  

char * str ="这是一个句子&#34 ;;

会在链接列表中找到以下字符串:

this is one sentence
is one sentence
one sentence
sentence

预期的结果不是这个,它应该在我的list-> string中的第一个单词之后添加NULL char

PS:链接列表没有很好地定义,它在最后添加了一个NULL,但我可以稍后处理。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

修改字符串文字是未定义的行为,这就是t[i]='\0'在这种情况下失败的原因。

如果您使用char str[] = "this is on sentence";,则会创建一个允许您修改的数组。

将来使用字符串文字时,你应该使用const指针const char *str = "this is one sentence",这样当你试图将它作为非const指针传递给你的words函数时,编译器就会抱怨阵列。

同时将t[i] != '\0'添加到while循环中以阻止它们超出数组的末尾。 while (t[i] != '\0' && t[i] != ' ') i++;

虽然在列表中存储指针没有任何问题,但请记住,只要传递给str的原始数组words有效且不是字符串文字,它们才有效。