【问题标题】:Dynamically storing array values in C在 C 中动态存储数组值
【发布时间】:2018-02-27 17:22:24
【问题描述】:

我在做什么 -

我正在尝试读取包含进程信息的文件并创建 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

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

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

编辑 - 我的输出

【问题讨论】:

  • 你能分享你的输出吗?
  • 您正在保存 same buffer 部分的地址。你需要复印一份。喜欢processName[i] = strdup(strtok(printLine, " "));
  • 已编辑。包含的输出消息
  • 感谢@BLUEPIXY 成功了:D

标签: c


【解决方案1】:

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

基本上,第一次阅读后你有以下情况:


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

1:printLine,processName[0]
2:arrivalTime[0]
3:processTime[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],processName[3] 2:arrivalTime[0],arrivalTime[1],arrivalTime[2],arrivalTime[3] 3:processTime[0],processTime[1],processTime[2],processTime[3]


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

【讨论】:

  • 感谢您的详细回答。知道了。已解决:D
  • 很高兴它有帮助,您能否将此答案标记为解决方案(按旁边的 v 按钮)。
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多