2

AB 120 CB 60 のような複数の行で構成されるファイル text(input.txt) を読み込もうとしています...
さて、今、そのファイルで複数回繰り返されている可能性のある名前をに転送しようとしていますそれらが一度だけ表示されるべきである二重ポインタ。以下の私のコードでは、それらのいくつかを取得していますが、セグメンテーション違反も発生しています。何が欠けているのか、何が間違っているのかわかりません。あなたの少しの助けが私を大いに助けてくれます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
   int i=1, state=0, k, dist;
int** myMat;
char *city1, *city2, **matnames;
FILE* p;
    city1 = (char*) malloc(sizeof(char));
    city2 = (char*) malloc(sizeof(char));
    matnames = (char**) malloc(sizeof(char*));
    myMat = (int**) malloc(sizeof(int*));               
p = fopen(argv[1],"r");
/************************************************************/
    matnames[0] = (char*) malloc(sizeof(char));
    matnames[1] = (char*) malloc(sizeof(char));
    matnames[2] = (char*) malloc(sizeof(char));
    matnames[2] = NULL;
    fscanf(p, "%s %s %d", city1, city2, &dist);
        strcpy(matnames[0],city1);
        strcpy(matnames[1],city2);
/************************************************************/  
while( fscanf(p,"%s %s %d",city1,city2, &dist) != EOF){             
        for(k=0; matnames[k]!=NULL; k++){                   
            if( strcmp(matnames[k], city1) != 0){
                 state++;
                }               
        }       
        if(state  == k){
            matnames[k] = (char*) malloc(sizeof(char));
            strcpy(matnames[k], city1);
            matnames[k+1] = (char*) malloc(sizeof(char));
            matnames[k+1] = NULL;
            }
        state = 0;
        for(k=0; matnames[k] != NULL;k++){                  
                if( strcmp(matnames[k], city2) != 0){
                    state++;
                }               
        }
        if(state == k){
            matnames[k] = (char*) malloc(sizeof(char));
            matnames[k+1] = (char*) malloc(sizeof(char));
            strcpy(matnames[k], city2); 
            matnames[k+1] = NULL;   
            }
        state = 0;

}
return 0;
}
4

4 に答える 4

3
matnames = (char**) malloc(sizeof(char*));

ここでは、1 つだけに十分なメモリを割り当てchar*ました。

それからあなたは呼んでいます

matnames[1] = (char*) malloc(sizeof(char));

一方、matnames には 1 つだけのchar*スペースmatnames[1]があり、2 番目のスペースにアクセスしようとしていますchar *

あなたがする必要があるのは

matnames = (char**) malloc(n * sizeof(char*));

格納する予定の要素の数はどこnですかmatnames[]

于 2012-06-09T05:55:54.683 に答える
1

とりわけ、1 つを格納するのに十分なメモリを割り当てましたmatnames、3 つの値を格納しています。また、メモリを malloc してすぐに malloc されたポインタを で上書きすることも役に立ちません。他にも問題があるかもしれませんが、最も差し迫った問題から始めましょう。 char *matnames[2]NULL*(matnames[2])

于 2012-06-09T05:56:46.983 に答える
1

「strdup()」にも興味があるかもしれません:

「malloc()」と「strcpy()」を 1 つの操作に結合し、正しいサイズを「malloc」したかどうかを心配する必要がなくなります。

于 2012-06-09T05:57:54.110 に答える
1

C では、式sizeof(char)は常に を返し1ます。これは定義によるものです。sizeof()多くの異なる種類のコンピューターで動作し、すべてがバイトを使用するわけではありません。

したがって、名前ごとに 1 バイトのみを割り当てています。都市名が 20 文字の長さになる場合は、 を使用しますmalloc(21)(文字列の末尾にスペースを入れることも忘れないでください'\0')。

ポインターについては、(char **)格納する必要があるポインターの数を計算し、 を掛ける必要がありますsizeof(char *)char *したがって、3 つのポインターを格納する必要がある場合は、 を使用しますmalloc(3 * sizeof(char *))

于 2012-06-09T05:58:41.743 に答える