-1

我正在尝试从文件中读取连续的行,并通过指向字符串数组的指针指向它们。但只有第一行按预期输出,之后输出未按预期显示。

input.txt:
Hi i am Michel
hello swing
how are you

o/p 是:

LINE[1]=Hi i am Michel
st_arr[0]=Hi
st_arr[1]=i
st_arr[2]=am
st_arr[3]=Michel

LINE[2]=hello swing
st_arr[0]=Hi
LINE[3]=how are you 
st_arr[0]=Hi

这是我的代码:

main()
{
    int i = 0,j=0,k=0,p=0;
    char lines[10][ 50];
    char words[10];
    char *st_arr[20];
    FILE *fp = fopen("input.txt", "r");
    while (fgets(lines[i], sizeof(lines[i]), fp))
    {
        lines[i][strlen(lines[i])-1] = '\0';
        i = i + 1;
    }
    fclose(fp);
    printf("The value of i=%d\n",i);
    for(j=0;j<i;j++)
    {
        printf("LINE[%d]=%s\n",j+1,lines[j]);
        {
            char *token=strtok(lines," ");
            while(token!=NULL)
            {
                st_arr[p]=malloc(strlen(token)+1);
                strcpy(st_arr[p],token);
                printf("\tst_arr[%d]=%s\n",p,token);
                token=strtok(NULL," ");
                p++;
            }
        }

        bzero(st_arr[j],sizeof(st_arr));
        p=0;

    }
}

有什么我明显遗漏的问题吗?

4

1 回答 1

1

看起来像这条线:

bzero(st_arr[j],sizeof(st_arr));

是超出堆栈的缓冲区溢出,清除部分“行”缓冲区。

更不用说通过 bzero 擦除 st_arr 中的这些分配所造成的内存泄漏:

st_arr[p]=malloc(strlen(token)+1);

另一个错误是您在从文件读取的每个字符串之间填充空值,然后您从第一个字符串中读取:

 char *token=strtok(lines," ");

这只会标记第一个空值,因此会丢失所有后续字符串。你的意思可能是:

 char *token=strtok(lines[j]," ");
于 2013-02-08T20:26:13.533 回答