0

我有一个代码,我从文本文件中读取并搜索特定单词(更具体地说是物种名称,例如“CH3”),然后读取下面列出的数据。我声明了一个函数void read_data(char *fargs[], double *data),其中fargs是一个字符串数组,其中包含文件名和在 main 中声明的物种名称。然后为了确保我找到正确的物种名称strstr(例如“CH3”而不是“CH3ONO2”),我写了一个短循环在物种名称的两侧放置空格。

char *spec;
int x;
spec[0] = ' ';
while (fargs[1][x]) {
    spec[x+1] = fargs[1][x];
    x++;
}
spec[x+1] = ' ';
spec[x+2] = '\0';

所以问题是,当我这样做时,程序稍后会给出一个分段错误(不是 strstr 它在有或没有循环的情况下都可以正常工作)。虽然当我不包括这个循环并且只fargs[1]对程序进行所有操作时,但它有时会发现错误的物种名称,就像上面给出的假设一样。即使我只是包含循环但以后再也不使用spec它也不起作用,这表明我正在以某种方式fargs[1]在循环中进行修改。另外,为了澄清我稍后会使用strcmpfargs[1]所以即使我只是在声明中包含空格,我也必须操作fargs[1]以类似的方式删除空格。我完全可以发布更多代码、程序输出、我正在读取的文本文件的示例等它。

4

3 回答 3

0

实际上,您已经创建了一个 char 类型的指针,其中包含其他字符或字符串的地址。

但是您直接将字符放入该指针中,并将其视为数组。由于数组的行为类似于指针,但这并不意味着您所做的事情是正确的。

您必须使用 malloc(N*sizeof(char)) 来保存整个字符串。

所以在你的程序中可能正在访问那些它没有的地址,这就是它给出段错误的原因

于 2012-08-29T15:41:05.067 回答
0

在查看此代码时,在我看来(除非我遗漏了什么)您没有为 分配任何空间*spec,也x从未定义过一个值,因此它完全是随机的,试试这个:

char *spec = NULL, *tmp;
int bff = 256, x = 0;

if(!(spec = malloc(bff)))
{
    //memory allocation failed
}
while (fargs[1][x])   
{
    if(bff <= x + 3)
    {
        bff *= 2;
        if(!(tmp = realloc(spec, bff)))
        {
            free(spec);
            //memory allocation failed
        }
        spec = tmp;
    } 
    spec[x + 1] = fargs[1][x];
    x++;
}
if(!(tmp = realloc(spec, x + 2)))
{
    free(spec);
    //memory allocation failed
}
spec = tmp;
spec[x + 1] = ' ';
spec[x + 2] = '\0';
//do what you need to do with spec
free(spec);

}

这应该可以解决问题,虽然我在文本框中徒手输入了这个,但它可能需要一些调整,但这应该是一个好的开始。

于 2012-08-29T15:43:45.327 回答
0

spec从未初始化,因此当您从 spec in 中读取时spec[0],这会导致未定义的行为。

您的代码的另一个问题是它x从未被初始化。

于 2012-08-29T15:35:05.023 回答