我想编写一个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];
这句话。我认为这句话只会引起问题。我想,我的逻辑是正确的。但我不知道如何纠正它。请帮我。提前谢谢你。
答案 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 );