1

csv ファイルを読み取る関数をコーディングしましたが、解析の途中でプログラムがクラッシュし、strcat でエラーが発生しました。エラーは 3 番目のフィールドである phone にあります。この読み取りで行ったエラーを見つけることができません。 function.誰も私がここでどこに行くのか考えていますか?

struct contact *readFile( struct contact *ptrList)
{
    struct contact *head, *newContact;
    FILE *fptr;
    char oneLine[CONTACT_MAX];
    char *sn, *fn, *ph, *co;
    head = ptrList;


    //open test.csv to be read
    fptr = fopen("test.csv", "r");

    if( fptr == NULL )
    {
        printf("\nCouldn't open %s...");
        return(ptrList);
    }
    fgets(oneLine, CONTACT_MAX, fptr);

    while( !feof(fptr) )
    {
        fgets(oneLine, CONTACT_MAX, fptr); // process the next line to be tokenized
        if (oneLine[strlen(oneLine) - 1] == '\n')
        {
            oneLine[strlen(oneLine) - 1] = '\0';
        }
        sn = strtok(oneLine, " , ");
        fn = strtok(NULL, " , ");
        ph = strtok(NULL, " , ");
        co = strtok(NULL, " , ");

        if ( head == NULL )
        {
            head = (struct contact *)malloc(sizeof(struct contact));
            ptrList = head;
                strcpy(head->fName,fn);
                strcpy(head->sName,sn);
                strcpy(head->phone,ph);
                strcpy(head->company,co);

            head->prev = NULL;
            head->next = NULL;

        }
        else
        {
            newContact = (struct contact *)malloc(sizeof(struct contact));
            head->next = newContact;
            newContact->prev = head;
            newContact->next = NULL;

            strcpy(newContact->fName, fn);
            strcpy(newContact->sName, sn);
            strcpy(newContact->phone, ph);
            strcpy(newContact->company, co);

            head = newContact;
        } // end of (ptrList == NULL)

    } // end of while( !feof(fptr))
    fclose(fptr);
    return(ptrList);

これは私が連絡先を定義した方法です:

struct contact {
                char sName[CONTACT_MAX+1];
                char fName[CONTACT_MAX+1];
                char phone[CONTACT_MAX+1];
                char company[CONTACT_MAX+1];
                struct contact *prev;
                struct contact *next;
                };
4

1 に答える 1

1

ここで私は要約しようとしました:

sn = strtok(oneLine, " , ");
fn = strtok(NULL, " , ");
ph = strtok(NULL, " , ");
co = strtok(NULL, " , ");

あなたは正しいフォーマットに大きく依存していますが、そうではないかもしれません。

sn = strtok(oneLine, " , ");
fn = sn ? strtok(NULL, " , ") : NULL;
ph = fn ? strtok(NULL, " , ") : NULL;
co = ph ? strtok(NULL, " , ") : NULL;

if (!co) continue; // bad string

BLUEPIXYが指摘したように:

printf("\nCouldn't open %s...", "test.csv");

割り当ては、C ではより単純に見える場合があります。

head = malloc(sizeof(*head));

fgets失敗する可能性があります:

if (fgets(oneLine, CONTACT_MAX, fptr) == NULL) break; // error, do something...

初期化されていないhead変数 (Kninnug に感謝):

struct contact *head = NULL; // otherise it contains garbage
于 2013-04-26T21:07:53.787 に答える