传递数组中的字符串

时间:2013-04-08 19:06:46

标签: c arrays string

我正在尝试将字符串(文本文件行)传递到数组中(arrayf1array2f2)。当我打印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 个答案:

答案 0 :(得分:2)

您尚未在array中为阵列分配任何内存。在将字符串复制到那里之前,您需要这样做。

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

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

strcpy(array[i], buffer);
printf("%s", array[i]);

答案 1 :(得分: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()写入它是安全的。

答案 2 :(得分:1)

在我看来,就像你在堆栈上分配了数组但未能确保它们足够大,因为每个数据的大小都是100。既然你不知道它们有多大,你可以动态地分配它们(使用@ JohnKugelman的解决方案)或等到声明它们直到你知道它们的大小需要它们(即,它们的长度是多长时间)需要坚持)。

答案 3 :(得分:1)

  

该程序没有明显原因崩溃

总有一个理由:)

这一行:

char *array[100];

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

然后这一行:

strcpy(array[i], buffer);

尝试将buffer复制到i th 指针。问题是你从未为这些指针分配任何内存,因此strcpy()崩溃了。就是这样:

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

将解决该错误。