Array of chars to linked list - 使用数组中的地址

Array of chars to linked list - Using the address in array

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

我的结构:

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]!='[=11=]' ;){
        aux = (SList) calloc(1, sizeof(struct slist));

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

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

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

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

        p++; //This counts words
    }

    return p;

}

我有点怀疑,我不能更改初始数组以在每个单词的末尾包含一个 NULL 字符(在 C 中声明的字符串是只读的,对吗?)

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

此时运行这个字符串的代码

char *str = "this is one sentence";

会在我的链表中得到以下字符串:

this is one sentence
is one sentence
one sentence
sentence

预期的结果不是这个,它应该在我的列表中的第一个单词后添加 NULL 字符->string

PS: 链表定义不明确,它在末尾添加了一个不必要的NULL,但我可以稍后处理。

感谢您的帮助!

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

如果您使用 char str[] = "this is on sentence"; 这将创建一个您可以修改的数组。

将来使用字符串文字时,您应该使用常量指针 const char *str = "this is one sentence",这样当您试图将它作为非常量传递给 words 函数时编译器会报错pointer/array.

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

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