我正在尝试将字符串中的单词传递给链表,事实是,我无法将内存重新分配给我的结构中的字符串,我应该使用数组中每个单词的地址。 / 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,但我可以稍后处理。
感谢您的帮助!
答案 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
有效且不是字符串文字,它们才有效。