1

文字列 (テキスト ファイルの行) を配列 ( arrayforf1およびarray2for f2) に渡そうとしています。を印刷するbuffer buffer2と、線がうまく表示されます。プログラムを使用してそれらを渡そうとするstrcpyと、明らかな理由もなくクラッシュします。私は次のことを試しました:

  • 無駄な二次元配列の使用
  • メソッドを操作してcharを返そうとし、それを配列に渡そうとしたので、このずさんなコードを避けることができますが、今のところはこれで十分です。

DEV-C++ で Windows 7 x64 を使用しています。

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

int main(int argc, char *argv[]) 
{
    char *arrayF1[20] ;
    char *arrayF2[20] ;
    int i = 0; 
    int size = 1024, pos;
    int c;
    int lineCount = 0;
    char *buffer = (char *)malloc(size);
    char *buffer2 = (char *)malloc(size);
    char *array[100];
    char *array2[100];


    if (argc!=3)
    {
       printf("\nCommand Usage %s filename.txt filename.txt\n", argv[0]); 
    }
    else
    {        
        FILE *f1 = fopen(argv[1], "r");
        FILE *f2 = fopen(argv[2], "r");

        if(f1) 
         {
          do { // read all lines in file
            pos = 0;
            do{ // read one line
              c = fgetc(f1);
              if(c != EOF) buffer[pos++] = (char)c;
              if(pos >= size - 1) { // increase buffer length - leave room for 0
                size *=2;
                buffer = (char*)realloc(buffer, size);
              }
            }while(c != EOF && c != '\n');
            lineCount++;
            buffer[pos] = 0;
            // line is now in buffer 
            strcpy(array[i], buffer);
            printf("%s", array[i]);
            //printf("%s", buffer);
            i++;
          } while(c != EOF); 
          printf("\n");
          fclose(f1);           
        }
        printf("%d\n",lineCount);
        free(buffer);    

        lineCount=0;
        i=0;
        if (f2)
        {
          do { // read all lines in file
            pos = 0;
            do{ // read one line
              c = fgetc(f2);
              if(c != EOF) buffer2[pos++] = (char)c;
              if(pos >= size - 1) { // increase buffer length - leave room for 0
                size *=2;
                buffer2 = (char*)realloc(buffer, size);
              }
            }while(c != EOF && c != '\n');
            lineCount++;
            buffer2[pos] = 0;
            // line is now in buffer 
            strcpy(array2[i], buffer);
            //printf("%s", buffer2);
            printf("%s", array2[i]);
            i++;
          } while(c != EOF); 
          printf("\n");
          fclose(f2);           
        }
        printf("%d\n",lineCount);
        free(buffer2);    
        }//end first else
    return 0;
}
4

4 に答える 4

2

の配列にメモリを割り当てていませんarray。そこに文字列をコピーする前に、それを行う必要があります。

array[i] = malloc(pos + 1);

if (array[i] == NULL) {
    // handle error
}

strcpy(array[i], buffer);
printf("%s", array[i]);
于 2013-04-08T19:10:55.400 に答える
1

明らかな理由もなくプログラムがクラッシュする

必ず理由があります:)

この行:

char *array[100];

文字への 100 個のポインターの配列を作成します。

次に、この行:

strcpy(array[i], buffer);

bufferyourを i番目のポインターにコピーしようとします。問題は、これらのポインターにメモリを割り当てていないため、strcpy()クラッシュすることです。これだけ:

array[i] = malloc(strlen(buffer)+1);
strcpy(array[i], buffer);

そのエラーを解決します。

于 2013-04-08T19:15:45.213 に答える
1

にするstrcpy()にはchar*、すでにメモリを割り当てている必要があります。これを行うには、静的char配列を作成します。

char array[100][50];   //Strings can hold up to 50 chars

または、ポインターを使用して動的に割り当てることもできます。

char *array[100];

for(int i = 0; i < 100; i++)
    array[i] = malloc(sizeof(char) * 50);    //Up to 50 chars

...

for(int i = 0; i < 100; i++)
   free(array[i]);          //Delete when you're finished

これらの方法のいずれかで割り当てた後は、 を使用して安全に書き込むことができstrcpy()ます。

于 2013-04-08T19:13:01.710 に答える
1

スタックに配列を割り当てたように見えますが、それぞれのサイズが正確であるため、配列が十分な大きさであることを確認できませんでした100。それらの大きさがわからないので、それらを動的に割り当てるか(@JohnKugelmanのソリューションを使用)、必要なサイズ(つまり、文字列の長さ)がわかるまで宣言を待つことができます保持する必要があります)。

于 2013-04-08T19:13:33.977 に答える