我几天前在这里得到了一个帮助,这个函数有一个类似的字符串:
"1 2.2 3 4.4 5 6.6 7 8.5"
并以下列形式将其插入到数组[2] [4](在本例中):
1 | 3 | 5 | 7
2.2|4.4|6.6|8.5
执行该操作的函数是:
//'function' is char*,'array' is double array
for(p = function; *p != '\0' ;p++){//convert double by strtod
item = strtod(p, &p);
++div;
if((div%2)!=0)
{
array[0][j]=item;
}
else
{
array[1][j++]=item;
div=0;
}
}
代码中的问题是函数只将值插入到数组[0] [j]而不是数组[1] [j]数组的含义似乎是(如果数组在begin中初始化为0) :
1 | 3 | 5 | 7
0 | 0 | 0 | 0
值只插入数组的第一行, 如果我用字符串调用该函数: “0.5 2 1 4 3 6 0.5 8” 所以项目总是0,我不知道为什么:\
上一篇文章: Try to insert string to array to check if the string describe function 感谢
答案 0 :(得分:3)
最初,您的代码有效。但是你的指针p
正在递增超过字符串的结尾,之后你会看到内存中的内容,并覆盖数组的内容。问题出在这里:
for(p = function; *p != '\0' ;p++) {
item = strtod(p, &p);
// (other code)
}
在为最后一个数字(8.5)调用strtod
之后,指针p
已经指向NULL终止符。但是,你的for循环调用p++
,它将增加一个超过NULL终止符。在此之后,您的函数会继续运行一段时间,为数组填充垃圾并可能损坏内存。
解决方案是:
for(p = function; *p != '\0' ;) {
item = strtod(p, &p);
// (other code)
}
在这种情况下,在大多数迭代中,p
指向每个数字之前的空间。这没关系,因为strtod
明确忽略了空格。在最后一次迭代之后,p
指向NULL终止符,并且您的循环在破坏数组和可能的其他内存部分之前结束。
以这种方式处理指针容易出错。我建议使用语言中提供的解析工具,从strtok()
开始。