作为旨在存储字典并根据它替换单词的程序的一部分,我编写了一个函数,它基本上将字符串(使用strtok
)分割为单词(用空格分隔),并且将每个单词存储到一个字符串数组中。
代码如下:
void StoreArr(char * original,char ** dest)
{
int i=0;
char * token =strtok(original, " ");
dest[i]=malloc(sizeof(token));
strcpy(dest[i],token);
++i;
while(token!=NULL)
{
dest[i]=malloc(sizeof(token));
strcpy(dest[i],token);
printf("%s",token);
token =strtok(NULL, " ");
++i;
}
}
我通过了以下变量:
char * File = "";
File=malloc(Length(Text)*(sizeof(char)));
char ** Destination[Count(' ',File)];
目的地的长度是单词的数量。
程序运行后,它会自动终止而不显示文本
它是使用StoreArr(File,Destination);
编辑:
int Length(FILE * file)
{
long result;
long origPos = ftell(file);//original start position of file
fseek(file, 0, SEEK_END);//move to end of file
result = ftell(file);//return value at end
fseek(file, origPos, SEEK_SET);//rewind to beginning
return result;
}
int Count(char a,char * b)
{
int i=0;
int count=0;
while(b[i]!='\0')
{
if(b[i]==a || b[i]=='\n')
++count;
++i;
}
return count+1;
}
?我收到警告"传递' StoreArr'来自不兼容的指针类型[默认启用]" 提前谢谢。
P.S:Breaking down string and storing it in array
上一篇文章中的代码与我的相同,但我的工作不起作用。我怀疑这两行是否有问题,我不知道为什么:
dest[i]=malloc(sizeof(token));
strcpy(dest[i],token);
答案 0 :(得分:0)
如果没有看到更多代码,您可能会在代码中看到未定义的行为。
声明Destination
你有一个指向指针的数组,我不知道这是不是你想要的。您还需要分配所有指针。
您还必须小心,因为strtok
修改了它标记的字符串,因此您无法传递文字或常量字符串。
如果是我,我会做这样的事情:
char **Destination = NULL;
StoreArr(Original, &Destination);
并且具有这样的功能
size_t StoreArr(char *original, char ***destination)
{
if (original == NULL || destination == NULL)
return 0;
size_t size = 0;
char *token = strtok(original, " ");
while (token != NULL)
{
/* (re)allocate array */
char **temp = realloc(*destination, sizeof(char *) * (size + 1));
if (temp == NULL)
{
/* Allocation failed, free what we have so far */
if (*destination != NULL)
{
for (size_t i = 0; i < size; ++i)
free((*destination)[i]);
free(*destination);
}
return 0;
}
/* Set the destination pointer */
*destination = temp;
/* Duplicate the token */
(*destination)[size++] = strdup(token);
/* Get next token */
token = strtok(NULL, " ");
}
return size;
}
该函数现在根据需要动态分配新条目,并在出错时返回数组中的条目数或0
。