在使用strtok标记数字列表的程序中出现错误0Xc0000005

时间:2015-08-05 15:22:18

标签: c strtok strcpy

我目前正在编写一个将文本文件作为输入的c程序。 在每一行我得到一个已知的前面的浮点数,用逗号分隔。 示例行:

0.92,0.21,0.98,1
0.23,0.37,0.29,-1
0.22,0.35,0.63,1
0.14,0.89,0.78,-1
0.26,0.42,0.67,1
0.01,0.77,0.92,-1
0.67,0.12,0.59,-1

我需要将数字放在一个数组中。 这是我的代码的一部分:

strcpy(tmp_line,strtok (line,","));
for(int j = 0;j < n + 1; j++)
{
            vec.arr[j] = atof(tmp_line);
            strcpy(tmp_line,strtok (NULL, ","));
}

我不知道为什么当我使用clion时,在循环结束时程序才会停止运行。 当我使用代码块时,它会发出此消息

  

PROCCES RETURNED(0Xc0000005)

这意味着我们正在使用无法访问的内存。

帮助?任何人

一些注意事项: vec是一个Vector结构。 Vector结构包含75长数组和(int)标记。我们使用数组的前n个单元格并将标记(+或 - 1)放在n + 1单元格(和标记部分)中。

tmp_line是一个包含当前行的char数组。

3 个答案:

答案 0 :(得分:1)

在我看到您的代码时,问题似乎在

 strcpy(tmp_line,strtok (NULL, ","));

for循环内。完成标记后,strtok()将返回NULLstrcpy()被视为strtok()的无效参数。

你应该分解语句,将strcpy()的返回值收集到临时指针变量中,检查NULL,如果不是NULL,则执行THREE.Projector

答案 1 :(得分:0)

好的,首先需要查看strtok的文档。 strtok返回的是char *到下一个标记的内容。在第一次调用时,它会隐藏字符串,然后在每次调用之后使用NULL作为参数获取下一个字符串。

所以,规范代码将是

char * my_string = "this is a blank delimited string";
char * tok;
tok = strtok(my_string, " ");
while(tok != NULL){
  /* do something with the string */
  printf("Token: %s\n", tok);
  tok = strtok(NULL, " ");
}

很难说出代码出错的地方,但至少不需要strcpy。根据您所说的,您在包含当前行的字符串顶部执行strcpy的问题也就是说,这意味着您正在混合字符串strtok正试图进行标记化;这可能是内存错误的来源。

答案 2 :(得分:0)

你的循环计数器可能是错误的。你说你只有n个浮点数但它循环n+1次。您也不需要计算浮动的数量。 您也不需要tmp_line。在您标记时,您可以计算浮动数。所以归结为:

j = 0;
for(char *tmp = strtok (line,","); tmp ; tmp = strtok (NULL, ","))
{
   vec.arr[j] = atof(tmp);
   j++;
}
// 'j' number of tokens found in this line

这也可以让您免于担心是否将有效字符串传递给strcpy()(因为您根本不需要):

您还需要考虑其他事项:

1)如果line包含不均匀的浮动数,如何处理 2)arr是否有足够的存储空间用于每行中的浮动数量 3)atof()不会报告转化错误。建议您使用strtof()strtod()来检测转换失败。