0

我想编写 ac 程序,用于根据运算符拆分“23 * 34”字符串,并将数字单独存储为字符串数组中的单独字符串。我是以下代码。

struct exp_details
{
        char operator[10];
        char *number[10];
}ed;

int split(int m,int n,char *str) /*m for operator index, n for str index */
{
        int i,j=0;
        for(i=n;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++)
        {
                ed.number[m][j] = str[n];
        }
        if(str[i] != '\0')
        {
                split(m++,i++,str);
        }
        else
                return 1;
        return 0;
}

但这种编码显示分段错误。它正在运行

ed.number[m][j] = str[n];

这个声明。我认为这个声明只会引起问题。我想,我的逻辑是正确的。但我不知道如何纠正它。请帮我。提前谢谢你。

4

3 回答 3

2

看起来你没有初始化j

于 2013-01-21T06:48:05.430 回答
1

可能您需要j在 for 循环中进行初始化:-

for(i=n, j = 0;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++)

另外,我发现您的递归调用存在一些问题。在下面的声明中: -

split(m++,i++,str);

您正在传递m++. operator index因此,在这里您假设字符串中的运算符将按照与char operator[10]数组中列出的顺序相同的顺序出现。这是完全错误的。

例如: -

如果您的运算符数组包含: - {'*', '+', '/', '-'}。您的字符串是: - 23*45-30+29,然后当您在第一个运算符 - 上拆分字符串时*,然后在下一次调用时,您将+作为运算符传递,因为它在您的operator array. 现在,在下一次运行时,您的循环将迭代直到它+在您的字符串中找到,因此它将 - 添加45-30到您的numbers数组中。所以,有错误。

您可能需要在迭代时测试字符串中的每个字符,无论它是否存在于operator数组中。否则你最终也会operators在你的numbers数组中存储一些。

于 2013-01-21T06:50:56.407 回答
0

The incrementation here is meaningless

 split(m++,i++,str);

since m and i are local and you increment them after you call the split() function.

you should also check the bounds when you address the array, make sure they are inside the valid range i.e. 0..9

assert( m >= 0 && m <= 9 );
assert( j >= 0 && j <= 9 );
assert( n >= 0 && n <= 9 );

ed.number[m][j] = str[n]

better still setup a constant for your arrays

#define MAXSIZE 10

struct exp_details
{
        char operator[MAXSIZE];
        char *number[MAXSIZE];
} ed;

...
assert( m >= 0 && m < MAXSIZE );
assert( j >= 0 && j < MAXSIZE );
assert( n >= 0 && n < MAXSIZE );
于 2013-01-21T07:21:48.653 回答