我正在尝试复制一个字符串数组"buff",其中包含正好 1000 行"OK"。 我想将 buff 数组复制到线性数组中,但无法在控制台输出中看到所有 1000 行。这是我的代码:
FILE *fp;
char buff[1000];
char* line[1000];
fp = fopen("protocol1.seq", "r");
int i;
for(i=0;i<=999;i++){
fgets(buff,sizeof(buff),fp);
line[i] = buff;
printf("%s",line[i]);
}
fclose(fp);
您有一个数组line[]
,它可以容纳最多 1000 行的指针,并且您有一个数组buff
可以容纳一行(最多 999 个字符)。 但是你没有地方可以容纳 1000 条不同的线。 如前所述,您的line
数组最终将包含一堆完全相同的指针的副本,所有副本都指向 buff
,这将包含您读取的最后一行的副本。
解决此问题的一种方法是调用malloc
在读取时为每一行分配内存:
fgets(buff,sizeof(buff),fp);
char *buffcopy = malloc(strlen(buff) + 1);
if(buffcopy == NULL) {fprintf(stderr, "out of memoryn"); exit(1); }
strcpy(buffcopy, buff);
line[i] = buffcopy;
你有一些错误。
如果您需要将所有行存储在数组中,则需要 2 个维度,行和字符串。
所以
char buff[1000][256];
可能是您要查找的,这给出了 1000 行长度为 255 的行,最后一个字符空间用于 NUL 字节。
虽然 char *line[1000] 是有效的,但这不是你的意思,这是你第一次尝试获得 2D 数组吗?
现在使用 256 而不是 sizeof(buff) 作为 fget 中的缓冲区控制。
在 c 中,您不能使用 = 运算符分配字符串,也不能与 == 进行比较,您可以分别使用 strcpy 和 strcmp。
而不是在读取循环中动态打印,它可能使调试和开发更容易具有打印功能。
为了避免奇怪的分段错误,初始化数组是有意义的。使用内存集将所有字节设置为 0
为了将来参考,格式 %s 打印所有字符直到 nul 字节,因此 printf-ing 未初始化的字符串可能会导致未定义的行为,可能是分段错误,并非总是如此,而是在被冒犯的 %s 之后的某个时间发生