2016-12-26 6 views
0

これに答えても謝罪しますが、私の問題を解決する答えが見つかりませんでした。 私はCで、システムの文字列を渡すためにしようとしている:コマンドのbashのバージョンがCの文字列に引用符を含むシステムコマンドを渡す方法

grep -w "dog\|animal" myfile 

である私は、次のCコードを持っている:私はそれをコンパイルして実行すると

char str[50] ="dog\\|animal"; 
char file[50]="myfile"; 
char buf[20]; 
snprintf(buf, sizeof(buf), "grep -w \"%s\" %s",str,file); 
system(buf); 

を私は与えられていますこのエラー:

sh: 1: Syntax error: Unterminated quoted string

最小例:

#include <stdio.h> 
#include <string.h> 
int main(){ 
    char str[50] ="dog\\|animal"; 
    char file[50]="myfile"; 
    char buf[20]; 
    snprintf(buf, sizeof(buf), "grep -w \"%s\" %s",str,file); 
    system(buf); 
} 
+4

2つのコンポーネント文字列サイズ50があり、それらを20バイトのターゲットにスクイーズしようとします。いずれにしても、20は余りにも短いです。オーバーヘッドには12文字、ファイル名に6文字、一致パターンに11文字が含まれています。それは幸せにつながるわけではありません。 (あなたが 'snprintf()'からの戻り値をチェックしたなら、それはあなたが与えたよりも多くのスペースが必要であると言います)。そして、最も基本的なデバッグ手法は 'printf(" [%s] \ n "、buf)'を追加して実行中のものを表示します。 –

+0

ええ、固定されました。私はちょうど最初に違反行を取り除きました。最小の例は、コンパイルして実行するコードのリテラル部分です。 –

+0

@JonathanLefflerああ私はばかだ、私はそれが200だと思った –

答えて

1

コメントを回答に転送します。

2つのコンポーネント文字列サイズ50があり、20バイトのターゲットに圧縮しようとします。おそらく20の代わりに200を使用する必要があります。

いずれにせよ、20が短すぎます。オーバーヘッドには12文字、ファイル名に6文字、一致パターンに11文字が含まれています。それは幸せにつながるわけではありません。 (snprintf()からの戻り値を確認した場合は、与えたよりも多くのスペースが必要であることがわかります)。最も基本的なデバッグ手法は、実行中のものを表示するためにprintf("[%s]\n", buf)を追加します。

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char str[50] = "dog\\|animal"; 
    char file[50] = "myfile"; 
    char buf[20]; 
    int size; 
    if ((size = snprintf(buf, sizeof(buf), "grep -w \"%s\" %s", str, file)) >= (int)sizeof(buf)) 
     printf("Oops! (%d) ", size); 
    printf("[%s]\n", buf); 
    system(buf); 
    return 0; 
} 

出力例(番組名sh11):sprintf()によって返されるサイズは、ヌルターミネータを含まないこと

$ ./sh11 
Oops! (28) [grep -w "dog\|anima] 
sh: -c: line 0: unexpected EOF while looking for matching `"' 
sh: -c: line 1: syntax error: unexpected end of file 
$ 

注意。バッファはすべてを保持するために少なくとも29バイト必要です。

関連する問題