在String数组中按字符存储字符

时间:2013-01-21 06:46:16

标签: c string segmentation-fault storing-data

我想编写一个c程序,用于根据运算符拆分“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];

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

3 个答案:

答案 0 :(得分:2)

您似乎没有初始化j

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

此处的增量无意义

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

因为m和i是本地的,你在之后递增,你调用split()函数。

你应该在解决数组时检查边界,确保它们在有效范围内 范围即0..9

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

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

最好还是为数组设置常量

#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 );