所以我有一个程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char kazkas;
char f[500];
char *k[500];
int x=0;
int o = 0;
int i=0;
memset(f, 0, 255);
memset(k, 0, 255);
int len = 0;
int par = 0;
FILE *fp;
if((fp=fopen("tekstas.txt", "r"))== NULL){
printf("failo \n ddd \t ddd");
exit(1);
}
else {
kazkas = fgetc(fp);
while(!feof(fp))
{
kazkas = fgetc(fp);
len = strlen(f);
f[len + 1] = f[len];
f[len] = kazkas;
if(kazkas == '\t')
{
k[i] = f;
i++;
memset(f, 0, 255);
par++;
}
}
}
printf("%s", k[0]);
return 0;
}
不要看整个代码,你不需要它。事情在
if(kazkas == '\t')
{
k[i] = f;
i++;
memset(f, 0, 255);
par++;
}
当我找到'\ t'符号时,我想把我所有的f(我读过的东西)转移到我的k [i]数组并将f设置为零,这样我就可以扫描其他段落了。 k [i] = f;如果我写了k [0] =“SOMETHING”,则不起作用;它会工作..有什么问题?我应该如何将我的f转换为k [i]?
答案 0 :(得分:2)
您需要为k[i]
分配一个新的内存块来指向。正如您所拥有的那样f
只指向一个长度为500 char
的位置,并不断重复使用。为避免写入您试图存储的数据,请尝试以下操作:
if (kazkas == '\t')
{
char *new = malloc(sizeof f);
memcpy(new, f, sizeof f);
k[i] = new;
//f has been safely copied over and can be re-used
}
因为此内存为malloc
d,所以当您不再使用它时,您需要确保free
。
编辑:如果您的数据是以空字符结尾的字符串,则可以使用strlen(f) + 1
代替sizeof f
和strncpy
代替memcpy
。但是无论char数组中存储了什么数据,我的示例都会有效。
答案 1 :(得分:1)
试试这个:
k[i]=(char*)malloc((len+1)*sizeof(char));
strcpy(k[i],f);
您需要先将内存分配给k [i],然后才能使用它来存储字符串(在您的情况下,它是段落)。
答案 2 :(得分:0)
memset(f, 0, 255);
将f的值更改为0,并且k [i]指向与f相同的位置,因此k [i]指向这些字符。我假设您想要在新位置使用f点,在这种情况下,您应该将其替换为:
f = (char*)malloc(500 * sizeof(char));
你也可以使用strcpy将f复制到k [i],正如Tu Bui建议的那样,尽管你仍然需要在之后清除f,大概是使用memset。