1

プレーン C で記述したコードの一部の行に問題があります。Windows では問題なく動作しましたが、ubuntu では「セグメンテーション エラー (コア ダンプ)」というエラーが表示されます。答えを探しましたが、そのエラーの原因となる問題が多すぎます。

char line[80];
char sett[50][80];
int index=0;
static const char filename[] = "squid.conf";
FILE *file = fopen ( filename, "r" );

while ( fgets ( line, sizeof line, file ) != NULL ) 
{
    strcpy(sett[index],line);
    index++;
}

ファイル全体を 2 次元配列に 1 行ずつ書き込みたいだけです。引用すると//strcpy(sett[index],line);、プログラムはエラーなしで正常に実行されます。

4

1 に答える 1

1

他の人が言ったように、あなたの squid.conf には 50 行以上あるかもしれません (私の squid.conf には 4948 行あります)

malloc(nlines * 80) の前に行をカウントするか、リンクされたリストを使用できます。

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

typedef struct sett {
    char value[80];
    struct sett *next;
} sett;

int main(void)
{
    char line[80];
    sett *curr, *first = NULL, *prev = NULL;
    static const char filename[] = "squid.conf";
    FILE *file = fopen(filename, "r");

    while (fgets(line, sizeof line, file) != NULL) {
        curr = malloc(sizeof(sett));
        if (curr == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        if (prev) {
            prev->next = curr;
        } else {
            first = curr;
        }
        strcpy(curr->value, line);
        curr->next = NULL;
        prev = curr;
    }
    fclose(file);
    curr = first;
    while (curr) {
        printf("%s", curr->value);
        prev = curr;
        curr = curr->next;
        free(prev);
    }
    return 0;
}
于 2013-02-01T19:46:36.207 に答える