在C中动态存储数组值

时间:2017-09-19 04:16:23

标签: c

我在做什么 -

我正在尝试读取包含进程信息的文件,并创建3个不同的数组。一个用于数组名称,第二个用于到达时间,第三个用于处理时间,然后计算它。进程数量并不固定,但出于测试目的,我将其保留为4个进程。

第一条printf线输出我想要的东西。文件内容采用数组形式。

void readFile() {

int i = 0;
char printLine[10];
char *processName[4];
char *arrivalTime[4];
char *processTime[4];

FILE *processFile = fopen("processes.txt", "r");

while(!feof(processFile)){ 

       fgets(printLine, 10, processFile); // get the line

       processName[i] = strtok(printLine, " ");
       arrivalTime[i] = strtok(NULL, " ");
       processTime[i] = strtok(NULL, "");
       printf("%s %s %s\n", processName[i], arrivalTime[i], processTime[i]);

       i++;       
}

printf("----\n%s %s %s\n", processName[0], arrivalTime[0], processTime[0]);
}

错误 - 错误(种类)是即使打印第1个元素(第1个处理)信息,第2个打印行的输出也给出了最后的处理信息。因此,不是打印第一个元素,而是打印最后一个元素。

processes.txt文件如下所示

P1 0 3
P2 1 6
P3 4 4
P4 6 2

P.S。 此文件的格式将被修复,因此没有问题。

我是一个真正的新手。请原谅我的愚蠢。

编辑 - 我的输出

output image

1 个答案:

答案 0 :(得分:1)

这是因为strtok的工作方式,它不返回指向令牌副本的指针,它返回指向ORIGINAL位置中令牌的第一个字符的指针。你需要自己创建一个副本。

基本上,在第一次阅读后你会遇到以下情况:

[1 ^ 'P''1''\0',2 ^ '0''\0',3 ^ '3',{{1} }]

1:'\0'printLine
2:processName[0]
3:arrivalTime[0]

  • 所以processTime[0]printLine只是指向第一个位置 - 标记为1 ^ - 。

  • processName[0]正指向第4个位置 - 标记为2 ^ - 。

  • arrivalTime[0]只是指向第3个位置 - 标记为3 ^ - 。

基本上你所有的“字符串” - 实际上只是字符指针 - 指向同一字符序列中的不同点。 当您读取新字符串时,它会覆盖旧数据,但指针会保留在原来的位置。

循环完成后,您会遇到以下情况:

[1 ^ processTime[0]'P''4',2 ^ '\0''6',3 ^ '\0',{{1} }]

1:'2''\0'printLineprocessName[0]processName[1] 2:processName[2]processName[3]arrivalTime[0]arrivalTime[1] 3:arrivalTime[2]arrivalTime[3]processTime[0]processTime[1]

正如您所看到的,一切都只是指向相同字符序列中的不同位置。