1

我正在尝试将字符串(文本文件行)传递到数组(arrayforf1array2for 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

对于strcpy()a 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

在我看来,您在堆栈上分配了数组,但未能确保它们足够大,因为每个数组都有 size 100。由于您不知道它们有多大,您可以动态分配它们(使用@JohnKugelman 的解决方案)或等到知道它们的大小需要之后再声明它们(即它们的字符串有多长需要持有)。

于 2013-04-08T19:13:33.977 回答
1

程序在没有明显原因的情况下崩溃

总是有原因的:)

这一行:

char *array[100];

创建一个包含 100 个字符指针的数组。

然后这一行:

strcpy(array[i], buffer);

尝试将您的复制buffer到第 i指针。问题是您从未为这些指针分配任何内存,因此strcpy()崩溃。只是这个:

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

将解决该错误。

于 2013-04-08T19:15:45.213 回答