我正在编写一个执行简单任务的程序;逐行读取文件,解析它,并将结果存储到数组中,其中结构为array [lineNumber] [lineElement]。在大多数情况下,除了我遇到的一个奇怪的问题外,它正在发挥作用。
在下面的代码中,对填充它的while循环外部数据的数组的任何访问只返回最后一个条目。无论lineNumber的键是什么,都会发生这种情况。基本上它就像覆盖一样,即使在while循环中它可以访问就好了。我认为只有两个项目可能是错误的我用粗体概述,虽然对于 char * processData [100]; ,它不应该是一个问题,因为它存储在一个声明的数组中在while循环之外(如果我记得正确的循环不应该有范围?),另一行** char ** processArray [100]; **,它可能是一个指针数组的双星,但只返回一个星形引入了一整堆错误,即前面提到的数组结构完全断开。
因此,简而言之,不是任何方式的C专家,并为这个问题耗尽我的资源,我想知道这里的C编码员是否可能有一些关于到底发生了什么的建议,以及我怎么能得到这个按照预期工作....如果我可以的话。
如前所述,代码。
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
FILE *ifp;
char line[80];
int returnValue = 0;
//Open file
ifp = fopen("dataFile", "rt");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file!\n");
returnValue = 1;
}
int lineCounter = 0;
char **processArray[100];
while(fgets(line, 80, ifp) != NULL) {
char *processData[100];
char *p = strtok(line, " ,\n");
int keyCounter = 0;
while (p != NULL) {
processData[keyCounter] = p;
p = strtok(NULL, " ,\n");
keyCounter++;
}
processArray[lineCounter] = processData;
printf("%d\n", lineCounter);
printf("Inside -> %s\n", processArray[0][0]);
lineCounter++;
}
printf("Outside %s\n", processArray[0][0]);
fclose(ifp);
int i;
int j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("%d-%d => %s\n ", i, j, processArray[i][j]);
}
}
return returnValue;
}
答案 0 :(得分:2)
[几乎]所有内容都会在外部while
循环中被覆盖,因此只剩下最后一个处理过的行。必须保留中间结果
我已经修复了程序,注释了bug。样式为#if 0 /* original code */ #else /* fixed code */ #endif
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
FILE *ifp;
char line[80];
int returnValue = 0;
//Open file
ifp = fopen("dataFile", "rt");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file!\n");
returnValue = 1;
}
int lineCounter = 0;
char **processArray[100];
// NOTE/BUG: things get lost on each iteration of this loop
while(fgets(line, 80, ifp) != NULL) {
char *processData[100];
char *p = strtok(line, " ,\n");
int keyCounter = 0;
while (p != NULL) {
// NOTE/BUG: p will get overwritten -- so we must save the string
#if 0
processData[keyCounter] = p;
#else
processData[keyCounter] = strdup(p);
#endif
p = strtok(NULL, " ,\n");
keyCounter++;
}
// NOTE/BUG: processData must be duplicated -- it is overwritten
// on the outer loop
#if 0
processArray[lineCounter] = processData;
#else
char **pA = malloc(sizeof(char *) * keyCounter);
processArray[lineCounter] = pA;
for (int copyidx = 0; copyidx < keyCounter; ++copyidx)
pA[copyidx] = processData[copyidx];
#endif
printf("%d\n", lineCounter);
printf("Inside -> %s\n", processArray[0][0]);
lineCounter++;
}
printf("Outside %s\n", processArray[0][0]);
fclose(ifp);
int i;
int j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
printf("%d-%d => %s\n ", i, j, processArray[i][j]);
}
}
return returnValue;
}
答案 1 :(得分:1)
processData
,并且在离开while循环后内存地址无效,无论您将其存储在processArray中。您需要从堆中分配(使用malloc或其他一些内存分配函数)