0

演算子に基づいて「23*34」文字列を分割し、数値のみを文字列配列に別の文字列として格納するための ac プログラムを作成したいと思います。私は次のコードです。

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

おそらく 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配列にもいくつかを格納することになります。

于 2013-01-21T06:50:56.407 に答える
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 );
于 2013-01-21T07:21:48.653 に答える