c - 在 C 中动态存储数组值

标签 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]);
}

错误 - 错误(有点)是第二个打印行的输出给了我最后的过程信息,即使我正在打印第一个元素(第一个过程)信息。因此,不是打印第一个元素,而是打印最后一个元素。

processes.txt 文件如下所示

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

附言 此文件的格式将被修复,因此没有问题。

在这方面我是一个真正的新手。请原谅我的愚蠢。

编辑 - 我的输出

output image

最佳答案

这是因为 strtok 的工作方式,它不返回指向 token 副本的指针,而是返回指向 token 在原始位置的第一个字符的指针。您需要自己创建一个副本。

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


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

1: printLine,processName[0]
2: 到达时间[0]
3: 进程时间[0]


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

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

  • processTime[0] 正好指向第 6 个位置 - 用 3^- 标记。

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

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


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

1:printLine,processName[0],processName[1],processName[2], 进程名称[3] 2:arrivalTime[0],arrivalTime[1],arrivalTime[2],arrivalTime[3] 3:processTime[0],processTime[1],processTime[2],processTime[3]


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

关于c - 在 C 中动态存储数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46291713/

相关文章:

C: 返回错误的代码风格?

c - 通过排序函数传递字符串数组

c语言中计算一个值出现的频率

c - 如何扫描n个整数行?

在 C 中将大位字符串转换为十六进制

c++ - 如何在macOS中测量线程的执行时间?

c - 如何在其他地方的函数中使用变量的值?

c - While 循环未正确完成

c - 按位 '&' 运算符

c++ - 大于 100,000 的随机数