我的代码部分有问题,我正在尝试读取文件的行,只剪切每行的第一个字,然后将其保存在数组中。
示例:
两条道路以黄色木头分开
抱歉我无法旅行
和我站在一个旅行者
并尽可能地向下看了一眼
它在灌木丛中弯曲的地方
因此我希望像这样的矢量:“两个,和,和,到”
但我得到了这个:“to,to,to,to,to”。
我的代码
dictionary *load_word(int autor, dictionary *D_first)
{
FILE *date;
char line[LONG_MAX_LINE];
char exeption[4] = " \n\t";
char *word;
int j=0;
if (autor == 1)
{
if ((date = fopen("test.txt", "r")) == NULL)
{
perror("robert_frost.txt");
}
while (fgets(line, LONG_MAX_LINE, date ) != NULL)
{
word = strtok(line, exeption); /*first word*/
add_dictionary_first(D_first, j, word);
j++;
}
fclose(date);
}
return D_first;
}
void add_dictionary_first(dictionary *D, int cont, const char *value)
{
expand_dictionary(&D, 1);
D->Distribution[D->size-1]->cont = cont;
D->Distribution[D->size-1]->value = value;
}
答案 0 :(得分:1)
问题在于这一行(正如莫斯科的Vlad在评论中所说):
D->Distribution[D->size-1]->value = value;
这只是指针赋值。这本身并没有错,但取决于 上下文,它不是你想要的。
while (fgets(line, LONG_MAX_LINE, date ) != NULL)
{
word = strtok(line, exeption); /*first word*/
add_dictionary_first(D_first, j, word);
...
}
在此,您始终使用相同的变量add_dictionary_first
致电line
。它是
一个数组,但数组在作为参数传递时会衰减为指针
功能。这意味着您的所有D->Distribution[D->size-1]->value
都指向
同一个地方。输入文件的最后一行以to
开头,这就是为什么你只能获得
to
。
您需要使用strcpy
复制字符串。
man strcpy
#include <string.h> char *strcpy(char *dest, const char *src);
strcpy()
函数复制src
指向的字符串,包括终止字符串 空字节('\0'
),指向的缓冲区dest
。字符串可能不重叠,目标字符串dest
必须是 大到可以收到副本。
因为你没有发布结构我只能猜测value
是
声明为char*
(如果编译器会抱怨char[]
)。
选项1
D->Distribution[D->size-1]->value = malloc(strlen(value) + 1); // note the +1 here
if(D->Distribution[D->size-1]->value == NULL)
{
// error handling
}
strcpy(D->Distribution[D->size-1]->value, value);
选项2
如果您的系统中有strdup
D->Distribution[D->size-1]->value = strdup(value);
if(D->Distribution[D->size-1]->value == NULL)
{
// error handling
}
在任何一种情况下,您都必须稍后释放内存。