2016-10-15 3 views
0

bashスクリプトを使用して文字列をCプログラムに送信し、その文字列をCプログラムで取得して処理する必要があります。問題は、文字列の使い方を理解できないことです。私はprintfに実際に何が得られたかを見てみました。そして、乱数を出力しました。bashスクリプトで文字列をcプログラムに送信してその文字列を使用する方法

これはbashスクリプトです:

length=`/home/hellboy632789/linelength $line`; 

これはCプログラムです:

int main(int argc, char *argv[]) 

{ 

    int length; 
    char *string = argv[1]; 
    for(length = 0; string[length] != '\0'; length++); 
    printf("%d\n", length); 
    return(0); 
} 

私はCにかなり新しいですが、任意の助けをいただければ幸いです。

答えて

1

文字列の長さをCプログラムの終了コードとして返します。 Bashは、その終了コードを変数$?で利用可能にします。

あなたのbashスクリプトは、あなたのC言語のプログラムがstdoutに出力している "length"変数を入れています。これはまったく同じことではありません。

プログラムが正常に実行された場合、終了コードは通常0であるため、エラーがあった場合は0以外の値になるため、bashスクリプトをそのまま使用してCコードを変更する方が理にかなっています。

return(length);printf("%d\n", length);return(0);に置き換えると、プログラムは必要に応じて動作します。 bashコマンドプロンプトで/home/hellboy632789/linelength testtestwhateverを実行するだけでテストできます。

もちろん、他にも多くの方法がありますが、これはもっと複雑なものへの最初のステップだと思います。幸運と辛抱強さ。

EDITは:例えば、これは動作します:

~/316643$ cat linelength.c 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int length; 
    char *string = argv[1]; 
    for(length = 0; string[length] != '\0'; length++); 
    printf("%d\n", length); 
    return(0); 
} 
~/316643$ gcc -o linelength linelength.c 
~/316643$ ./linelength qwertyui 
8 
~/316643$ line="qwerty uiop" 
~/316643$ length=`./linelength "$line"` 
~/316643$ echo "length is $length bytes" 
length is 8 bytes 
~/316643$ 

EDIT 2:バッシュあなたはバックスラッシュを使用して、スペースを保護したり、引用符で文字列を囲む場合を除いて、スペースでコマンドlinelengthを次のすべてを分割します。あなたは、スペースで引数の2つの選択肢があり、どちらかのあなたは、このようなスペースを守る:

~/316643$ line="qwerty uiop" 
~/316643$ ./linelength "$line" 
length is 12 bytes 
~/316643$ 

注これはスペースをカウントすること。

そうでなければ、1からargc-1までのすべてのargv [i]を数えるようにCプログラムを修正します。それはスペースを数えないので、単語の間にスペースがあるかどうかはわかりません。

+0

ああ、あなたは 'argc> 1'をチェックしなければなりません。さもなければ、パラメータなしで実行するとあなたのプログラムはひどく失敗します。 'argc == 1'が' return(1) 'の理由になります... – Law29

+0

何らかの理由で印刷長さがあるとき何も印刷されません。 bashスクリプトはCプログラムを何回か呼び出すため、Cプログラムはそのたびに長さを出力してから0を返してbashスクリプトに戻りますが、何も表示しないでbashスクリプトはプログラムを再び呼び出します改行した後、もう一度何も印刷しません。 –

+0

あなたの質問を編集して、実際に使用しているCプログラムを置いてください(現在はそこにprintfが全く含まれていないので)。私のクリスタルボールは、あなたが '\ n'を逃したか、あなたのスクリプトがスクリーンに全く何も表示していないという事実を、' $ length'変数を更新するだけで伝えます。 – Law29

関連する問題