C需要指定char f [500]; char * k [500];一个到另一个。

时间:2014-03-05 20:05:49

标签: c

所以我有一个程序:

#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]?

3 个答案:

答案 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 fstrncpy代替memcpy。但是无论char数组中存储了什么数据,我的示例都会有效。

答案 1 :(得分:1)

试试这个:

k[i]=(char*)malloc((len+1)*sizeof(char));
strcpy(k[i],f);

您需要先将内存分配给k [i],然后才能使用它来存储字符串(在您的情况下,它是段落)。

答案 2 :(得分:0)

对于前255个字符,

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。