1

typedefで定義された構造を含む入力があります。後でこれらを使用して、メイン関数の変数を初期化します。

例えば:

typedef struct {
   int numer;
   int denom;
} Rational;

int main()
{
Rational half, *newf = malloc(sizeof(Rational));

half = (Rational){ 1, 2 };
*newf = (Rational){ 2, 3 };
}

これが私がしたいことです:私は2つの初期化ラインを関数呼び出しに変換したいと思います。

例えば:

half = (Rational){ 1, 2 };

次のようになります。

init_Rational( &half,  1, 2  );

*newf = (Rational){ 2, 3 };

に変わる必要があります

init_Rational( newf,  2, 3  );

秘訣は、Rationalが以前に構造体として定義されたことを思い出し、初期化を関数呼び出しに置き換えることです。Rationalと呼ばれる必要はなく、任意の名前にすることができます。

宣言がstructtypedefであることを認識すると、上記のように次のように実行する必要があります。

振り向く:

something = (someStructName){ data1, data2, data3.. };

の中へ

init_someStructName( &something, data1, data2, data3.. );

またはポインタの場合...ターン:

*something = (someStructName){ data1, data2, data3.. };

の中へ

init_someStructName( something, data1, data2, data3.. );

誰かがここで私を助けてくれますか?ありがとう!

4

2 に答える 2

1

構造体名を動的に検出する必要があるということは、事前に正規表現全体を記述できないことを意味するため、これは非常にトリッキーな問題です。

ファイル名が foo.c であると仮定した場合の解決策の 1 つを次に示します。

sed -n '/^typedef struct/,/^}/{/^}/{s/.* \(.*\);/\1/p}}' foo.c | xargs -I {} sed -i -e 's/^\(\s*\)\*\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'( \2,\3);/' -e 's/^\(\s*\)\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'( \&\2,\3);/' foo.c

sedこれは、各構造体名を 1 行に出力するために1 つのパスを実行し、次に を使用xargsして各構造体の追加sedコマンドを作成し、ファイルの置換をその場で実行します。

のバージョンがまたはのショートカットをsedサポートしていない場合は、の代わりにおよびを使用できます。\s\w[ \t]\s[_a-zA-Z0-9]\w

于 2012-09-21T22:31:34.927 に答える
0

ほとんど読めない!

sed -e 's/\(\**[a-zA-Z_][a-zA-Z_0-9]*\) *= *( *\([a-zA-Z_][a-zA-Z_0-9]*\) *) *{\([^}]*\)} *;/init_\2(\&\1,\3);/'

注: これは 1 行です 注 2: 可能なセパレーターとしてスペースのみが存在する可能性があると想定しています (TAB はありません) 注 3: 形式 " *x" は変更されていません&*x。「*」と識別子の間にスペースはないと仮定しました。

于 2012-09-21T22:37:59.157 に答える