簡體   English   中英

C程序中與awk的語法沖突

[英]Syntax conflict with awk in C program

我試圖將一個小的awk腳本集成到C程序中,但是每次嘗試對其進行編譯時,都會遇到語法錯誤,因為gcc認為它不是C,而是C。

    terminal_monitor = popen("awk '{if(l1){
    download=($2-l1)/1024
    download_round=sprintf("%.2f kB/s", download)
    upload=($10-l2)/1024
    upload_round=sprintf("%.2f kB/s", upload)
    print download_round, upload_round
}
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");

這是gcc( http://pastebin.com/fm8FAZjD )的輸出:

root@ubuntu:~/Desktop# gcc monitor.c -o monitor
monitor.c: In function ‘main’:
monitor.c:8:26: warning: missing terminating " character [enabled by default]
 terminal_monitor = popen("awk '{if(l1){
                          ^
monitor.c:8:1: error: missing terminating " character
 terminal_monitor = popen("awk '{if(l1){
 ^
monitor.c:9:5: error: ‘download’ undeclared (first use in this function)
     download=($2-l1)/1024
     ^
monitor.c:9:5: note: each undeclared identifier is reported only once for each function it appears in
monitor.c:9:15: error: ‘$2’ undeclared (first use in this function)
     download=($2-l1)/1024
               ^
monitor.c:9:18: error: ‘l1’ undeclared (first use in this function)
     download=($2-l1)/1024
                  ^
monitor.c:10:5: error: expected ‘)’ before ‘download_round’
     download_round=sprintf("%.2f kB/s", download)
     ^
monitor.c:14:1: error: too few arguments to function ‘popen’
 }
 ^
In file included from monitor.c:1:0:
/usr/include/stdio.h:873:14: note: declared here
 extern FILE *popen (const char *__command, const char *__modes) __wur;
              ^
monitor.c:14:1: error: expected ‘;’ before ‘}’ token
 }
 ^
monitor.c: At top level:
monitor.c:15:1: error: expected identifier or ‘(’ before ‘else’
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
 ^
monitor.c:15:21: error: expected identifier or ‘(’ before ‘}’ token
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                     ^
monitor.c:15:22: warning: missing terminating ' character [enabled by default]
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                      ^
monitor.c:15:21: error: missing terminating ' character
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                     ^
monitor.c:16:1: error: expected identifier or ‘(’ before ‘if’
 if (terminal_monitor == NULL) {
 ^
monitor.c:20:1: error: expected identifier or ‘(’ before ‘while’
 while (terminal_monitor!= NULL){
 ^
monitor.c:25:1: error: expected identifier or ‘(’ before ‘return’
 return 0;
 ^
monitor.c:26:1: error: expected identifier or ‘(’ before ‘}’ token
 }
 ^

有什么辦法告訴gcc這不是C,並且應該像普通字符串一樣處理?

“整合”甚至是什么意思? 如果只希望C程序包含AWK源,則它必須是正確的C字符串。

您可以通過使用反斜杠將雙引號轉義來嵌入雙引號,“ here is a quoted string: \\"hello\\""

對於較長的文本,使用C的相鄰字符串文字的自動串聯很方便,它使您不必使用行繼續:

const char *awkcode =
"awk '{if(l1){"
"download=($2-l1)/1024"
"download_round=sprintf(\"%.2f kB/s\", download)"
"upload=($10-l2)/1024"
"upload_round=sprintf(\"%.2f kB/s\", upload)"
"print download_round, upload_round"
"}"
"else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev)"
" <(sleep 1; grep eth0";
" /proc/net/dev)\", \"r\");"

這很難理解,但是可以改進。

嘗試在所有行尾添加反斜杠“ \\”。 由於程序中的每一行都被視為C的單獨指令,因此它給出了您提到的那些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM