我目前正在编写一个将文本文件作为输入的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数组。
答案 0 :(得分:1)
在我看到您的代码时,问题似乎在
中 strcpy(tmp_line,strtok (NULL, ","));
在for
循环内。完成标记后,strtok()
将返回NULL
,strcpy()
被视为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()
来检测转换失败。