将字符串插入双数组

时间:2013-12-18 20:12:02

标签: c string

我几天前在这里得到了一个帮助,这个函数有一个类似的字符串:

 "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 感谢

1 个答案:

答案 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()开始。