2016-12-26 85 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

您有兩個組件字符串大小爲50,並且您試圖將它們擠入一個20字節的目標。你應該使用200或20個。無論如何,20個太短。你有12個字符的開銷加6個文件名和11個匹配模式。這不會導致幸福。 (請注意,如果你檢查過'snprintf()'的返回值,它會告訴你它需要更多的空間。最基本的調試技術將添加'printf(「[%s] \ n」,buf)'來顯示正在執行的內容。 –

+0

好的,固定的..我剛剛刪除了違規行。最小的例子是我的代碼的文字片段編譯和「運行」 –

+0

@JonathanLeffler哦,上帝我是個白癡,我認爲它是200 –

回答

1

將評論轉移到答案。

您有兩個組件字符串大小爲50,並且您嘗試將它們擠入20個字節的目標。你應該使用的可能是200而不是20.

無論如何,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):

$ ./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 
$ 

。注意,通過sprintf()返回的大小不包括空終止;緩衝區至少需要29個字節來存放所有內容。

相關問題