1

私が取得しているエラーは、strcat.asm ファイルに移動し、メイン ループの入り口にブレークポイントを設定します。私が作成した readFile メソッドは、この strlen ループで文字列がトークン化される直前に壊れています。

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 = sn ? strtok(NULL, " , ") : NULL;
        ph = fn ? strtok(NULL, " , ") : NULL;
        co = ph ? strtok(NULL, " , ") : NULL;

ここで私が間違っているという考えはありますか?

私の readFile() は次のとおりです。

struct contact *readFile( struct contact *ptrList)
{
    struct contact *head = NULL;
    struct contact *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...", "test.csv");
        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 = sn ? strtok(NULL, " , ") : NULL;
        ph = fn ? strtok(NULL, " , ") : NULL;
        co = ph ? strtok(NULL, " , ") : 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);
}

ファイルの形式は次のようになります。

姓、名、番号、会社

ビルダー、ボブ、1234567、ボブの

不明、スクープ、8765645、ボブズ

4

1 に答える 1

1
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のメンバーが初期化されていない状態で逆参照しています。これはhead未定義の動作であり、終了した配列が必要であるため、おそらくエラーが発生strcpy\0ます。ただし、 head のメンバーを初期化していないため、それらが終了しているかどうかはわかりません。たとえそうであっても、strcpy()チェックのために読み取る必要\0があり、初期化されていない限り、初期化されstrcp()ていないメモリを読み取るという問題があります。

そして最後に標準的な引用:

J.2 未定義の動作

1 次の状況では、動作は未定義です。

[..]

malloc 関数によって割り当てられたオブジェクトの値が使用されます (7.20.3.3)。

したがって、解決策は、オーバーライドしない限り、memblock がどこでも終了するようにすることですmemset()0

于 2013-09-24T10:46:41.933 に答える