0

(ファイルから) 文字列をマトリックスに入れ、結果を出力する必要があります。これを行う正しい方法を理解するのに問題があります:

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

int main (int argc, char *argv[])
{
    const int MAX = 50;
    char mat[MAX][MAX];
    char str[MAX];
    char word[MAX];
    int row = 0;
    int i = 0;

    FILE * fp;

    fp = fopen ("file.txt", "r");

    if (fp == NULL)
        printf ("Error!\n");

    while (fgets(str, MAX, fp) != NULL)
    {
        sscanf (str, "%s\n", word);

        strcpy(mat[i][0], word);

        row++;
    }

    for (i = 0; i <= row; i++)
    {
            puts(mat[i][0]);
    }

    return 0;
}

私は明らかに間違ったことをしていますが...何ですか?

次のようなファイルがあります。

One
Two
Three
Four
Five
Six
Hello
4

4 に答える 4

3

これを でコンパイルするとgcc、2 つの警告が表示されます。各警告は、コード内の 3 つの主要なエラーのいずれかを示しています。

main.c: In function 'main':
main.c:24: warning: passing argument 1 of 'strcpy' makes pointer from integer without a cast
main.c:31: warning: passing argument 1 of 'puts' makes pointer from integer without a cast

これらの各行番号 (24 と 31) は、代わりに文字配列である をmat[i][0]使用する必要があるときに、文字である を使用している行です。mat[i]それらを修正すると、問題が 1 つだけ発生します。ループi内で常に 0 であるを使用します。while行が進むにつれてインクリメントされる を使用するrowと、プログラムは設計どおりに動作するはずです。

プログラムを改善するために変更したいことが他にもいくつかあります。whileループは文字列を 1 つのバッファーに読み取り、それを 2 番目のバッファーにコピーしてから、マトリックスにコピーします。マトリックスに直接スキャンするだけで完了です。

于 2012-08-03T12:04:59.810 に答える
2

通常、マトリックスには数値が含まれます。あなたにはcharsが含まれています。コードに問題がありますが、適切な回答を得るには、読んでいるファイルの形式をお知らせください (質問に小さなものを貼り付けてください)。

編集: このファイルには、改行で区切られた文字列の配列が含まれています。次のように読むことができます (文字列に空白が含まれていない場合):

    while (fscanf(fp, "%s\n", mat[row]) > 0)
    {
        row++;
    }

    for (i = 0; i <= row; i++)
    {
            printf( "%s\n", mat[i]);
    }
于 2012-08-03T12:02:50.190 に答える
1

指定されたインデックスを持つマトリックスの要素に文字列をコピーする必要があります。行列の最初の要素へのポインターを strcpy に渡す必要があります (つまり、[0] を削除します)。

次のようにします。

while (fgets(str, MAX, fp) != NULL)
{
    sscanf (str, "%s\n", word);
    strcpy(mat[i], word);
    row++;
}

EDIT:文字列を印刷するときも、mat [i] [0]ではなくmat [i]のみを使用します。

于 2012-08-03T12:03:35.087 に答える
0

コードにいくつか変更を加えました。まず、間違いを特定しましょう。

  1. char mat[MAX][MAX];文字列マトリックスを作成するという意図には役立ちません。

  2. 読む必要はありませんsscanf (str, "%s\n", word);。すでにファイルから読み取っています。直接使用できます。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char *argv[])
    {
        const int MAX = 50;
        char *mat[MAX][MAX];
        char str[MAX];
        int i = 0, j = 0;
        int now = 0;
    
        FILE * fp;
    
        fp = fopen ("file.txt", "r");
    
        if (fp == NULL)
            printf ("Error!\n");
    
        while (fgets(str, MAX, fp) != NULL)
        {
            //sscanf (str, "%s\n", word);
    
            mat[i][j] = malloc(sizeof(str));
    
            strcpy(mat[i][j], str);
    
            j++;
            now++; //Tracks no.of elements 
            if(j == MAX)
            {
                 j = 0;
                 i++; //store in next row  
            }
        }
     for (i = 0; i < MAX; i++)
            for (j = 0; j < MAX; j++)
        {
                if(now == 0)
                    break;
    
                now--;
    
                puts(mat[i][j]);
                free(mat[i][j]);//Avoids memory leak        
        }
    
    return 0;
    

    }

于 2012-08-03T12:29:52.767 に答える