这是我的c代码的一部分,该程序将读取由行分隔的关键字文件,并将其存储到字符串数组中。.....
int keyno = 4;
char *keywords[keyno];
char var[100];
i=0;
while(fgets(var, sizeof(var), k)!=NULL){ //k is the file
printf("var: %s", var);
if(i>0)
keywords[i-1]=var;
printf("keyword: %s", keywords[i-1]);
i++;
}
for (i=0; i<keyno;i++)
printf("keyword: %s", keywords[i]);
结果:
var:
keyword: (null)
var: abc
keyword: abc
var: def
keyword: def
var: ghi
keyword:ghi
var: jkl
keyword: jkl
var:
keyword: @-g(?)
keyword: @-g(?) keyword: @-g(?) keyword: @-g(?) keyword: @-g(?)
为什么关键字在forloop中消失了...?我应该添加哪一行?
答案 0 :(得分:2)
char *keywords[keyno];
是一个指针数组。
在此行的循环中
keywords[i-1]=var;
您使keywords
中的所有指针都指向var
。因此,当您打印keywords
时,实际上实际上只打印了var
次。
相反,您可以这样做
char keywords[keyno][100];
并复制如下:
strcpy(keywords[i-1], var);
答案 1 :(得分:0)
在声明这样的数组时
char* keywords[keyno];
您要声明一个指向字符串的指针数组。但是指针需要指向某个地方 并且每个指针都需要指向不同的位置。
keywors[i-1]=var;
使每个指针指向相同的地址,即数组var
要解决此问题,请在从文件中获取内容时分配内存。
例如
keywords[i-1] = malloc(strlen(var)+1); /* allocate memory */
strcpy(keywords[i-1], var); /* copy to the newly allocated memory */
稍后您需要释放该内存
for (int i = 0; i < keyno; ++i)
free(keywords[i[);
作为预防措施,请确保在程序的开头将所有指针都设置为NULL,因为在未初始化的指针上释放是未定义的行为,但是释放NULL指针是可以的。
char* keywords[key];
for (int i = 0; i < keyno; ++i)
keywords[i] = NULL;
...
while(fgets(var, sizeof(var), k)!=NULL){ ... }
...
for (int i = 0; i < keyno; ++i)
free(keywords[i[);
答案 2 :(得分:-2)
简而言之,var
只是一个指针(它实际上是一个数组,但是区别在这里不相关)。这意味着:
keywords[i-1]=var
将所有数组项分配给该指针(因此它们存储相同的值)。var
变得很奇怪之后(当fgets返回null时会发生这种情况),所有条目也变得很奇怪。一种简单的解决方案是将keywords
声明为char keyword[num][len]
,即IIRC,并直接在keyword[i]
内部进行读取。