我正在尝试将字符串(文本文件行)传递到数组中(array
为f1
而array2
为f2
)。当我打印buffer
buffer2
时,线条就会很好。当我尝试使用strcpy
传递它们时,程序崩溃没有明显的原因。我尝试过以下方法:
我正在使用带有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;
}
答案 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);
将解决该错误。