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
有效且不是字符串文字时才有效。
我正在尝试将单词从字符串传递到链表,问题是,我无法将内存重新分配到我的结构中的字符串,我应该使用数组中每个单词的地址。
我的结构:
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
有效且不是字符串文字时才有效。