为什么在打印txt文件中的所有名称后程序崩溃了?

时间:2015-06-24 11:31:33

标签: c

以下是代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    FILE *fptr;
    if((fptr=fopen("names.txt","r"))==NULL)
    {
        printf("Error");
    }

    int i,j;
    char *nptr[6000],c;

        for(i=0;i<6000;i++)
    {
        nptr[i]=malloc(sizeof(char)*20);
        }

    for(i=0;i<6000;i++)
    {
        c=fgetc(fptr);
        for(j=0;c!=',';j++)
        {
            /*if(c==' " ')
            {
                c=fgetc(fptr);
            }*/
            nptr[i][j]=c;
            c=fgetc(fptr);  
        }
        nptr[i][j]='\0';
        puts(nptr[i]);
    }

        for(i=0;i<6000;i++)
        {
            free(nptr[i]);
        }

    fclose(fptr);
    return 0;

}

如果我想打印没有引号的名字,我写了代码你可以看到我已经评论了一段时间,因为它不会让名字被打印..如果它被禁用然后程序崩溃后打印名字,否则它在开始时崩溃..

Link to the txt file

2 个答案:

答案 0 :(得分:5)

你有一个错字。这样:

for(i=0;c<6000;i++)

应该是

for(i = 0;i < 6000; i++)

c应该是int,因为fgetc会返回int,而不是char

另一个问题是姓氏后面没有逗号。所以

for(j=0;c!=',';j++)

应该是

for(j = 0; c != ',' && c != EOF; j++)

@SouravGhoshanswer

解释了其他三个问题

答案 1 :(得分:1)

除了上面CoolGuy's先生answer中提到的要点之外,我想指出更多案例,例如

  1. 在您的第二个for循环中,c<6000应该是i < 6000,否则,这是一个潜在的无限循环。

  2. 如果fopen()失败,您应该中断您的程序(至少,避免使用返回的文件指针),否则,如果继续正常,则基本上没有NULL检查的含义。

  3. 在使用返回的指针之前,请务必检查malloc()是否成功。另外,sizeof(char)保证在C中生成1,无需将大小乘以sizeof(char),这是多余的。

  4. 在内部循环for(j=0;c!=',';j++)中,您应该将j的最大值限制为19,因为您要为固定大小的20分配内存。