2014-12-11 19 views
0

我們被賦予了一個賦值,它將從終端獲取兩個命令並將第一個命令傳送到第二個命令。我相信我的代碼結構是正確的,但是在編譯它時抱怨我的初始char * cmd不是一個有效的語句。這是爲什麼發生?我很困惑,任何援助將不勝感激。C字符數組指針不是一個有效的語句

代碼:

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

void main(int argc, char *argv[]) 
{ 
    int f_des[2]; 

    if(pipe(f_des) == -1) 
    { 
     perror("pipe"); 
     exit(1); 
    } 

    switch(fork()) 
    { 
     case -1: perror("fork"); 
      exit(2); 
      case 0: dup2(f_des[1], fileno(stdout)); 
      close(f_des[0]); 
      close(f_des[1]); 
      char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
      char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
      int ret; 
      ret = execvp(cmd,path); 
      exit(3); 
     case default: dup2(f_des[0], fileno(stdin)); 
      close(f_des[0]); 
      close(f_des[1]); 
      char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
      char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
      int ret; 
      ret = execvp(cmd,path); 
      exit(4); 
    } 
} 

錯誤:

cc: Error: lab1.c, line 22: Invalid statement. 
char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
^ 
cc: Error: lab1.c, line 22: Missing ";". 
char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
-----------------------------------------------------^ 
cc: Error: lab1.c, line 23: Invalid statement. 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
^ 
cc: Error: lab1.c, line 23: Missing ";". 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
------------------------------------------------------------^ 
cc: Error: lab1.c, line 24: Invalid statement. 
int ret; 
^ 
cc: Error: lab1.c, line 27: Invalid expression. 
case default: dup2(f_des[0], fileno(stdin)); 
-----^ 
cc: Error: lab1.c, line 30: Invalid statement. 
char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
^ 
cc: Error: lab1.c, line 30: Missing ";". 
char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
------------------------------------------------------^ 
cc: Error: lab1.c, line 31: Invalid statement. 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
^ 
cc: Error: lab1.c, line 31: Missing ";". 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
------------------------------------------------------------^ 
cc: Error: lab1.c, line 32: Invalid statement. 
int ret; 
^ 
cc: Error: lab1.c, line 25: In this statement, "ret" is not declared. 
ret = execvp(cmd,path); 
^ 
cc: Error: lab1.c, line 25: In this statement, "cmd" is not declared. 
ret = execvp(cmd,path); 
-------------^ 
cc: Error: lab1.c, line 25: In this statement, "path" is not declared. 
ret = execvp(cmd,path); 
-----------------^ 
+7

不能像''/ usr/bin /「+ argv [1]'那樣用'+'來添加兩個字符串。不要僅僅因爲你可以用其他語言來編寫語法。 – 2014-12-11 03:00:46

+3

它看起來像你正在編譯爲C89。它是'default:',而不是'case default:'。 – mafso 2014-12-11 03:02:32

+0

@餘浩,謝謝你的通知,你會怎麼建議呢? strcat的? – Kyle 2014-12-11 03:20:30

回答

2

我嘗試刪除錯誤。我不確定這是否正常工作。

char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 

改變+爲,。

char *cmd[] = {"/usr/bin/",argv[1],argv[1], (char *)0}; 

case dafault: 

default: 

,使案件在一個塊。使用參數。 { }

雖然傳遞參數給execvp第一個參數是char *char *[].

那就試試這個代碼。我不確定這是否正常,但所有錯誤都已清除。

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

void main(int argc, char *argv[]) 
{ 
    int f_des[2]; 

    if(pipe(f_des) == -1) 
    { 
     perror("pipe"); 
     exit(1); 
    } 

    switch(fork()) 
    { 
     case -1: perror("fork"); 
       exit(2); 
     case 0: { dup2(f_des[1], fileno(stdout)); 
        close(f_des[0]); 
        close(f_des[1]); 
        char *cmd = "/usr/bin/"; 
        char *const path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
        int ret; 
        ret = execvp(cmd,path); 
        exit(3); } 
     default: { dup2(f_des[0], fileno(stdin)); 
        close(f_des[0]); 
        close(f_des[1]); 
        char *cmd = "/usr/bin/"; 
        char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
        int ret; 
        ret = execvp(cmd,path); 
        exit(4); } 
     } 
    } 
1

首先,來連接到C/C++字符串,您使用<string.h>strcat(const char *,const char *)功能。其次,execvp()的第二個參數是const char *argv[]。第三,第一個參數是execvp()const char *cmd而不是char *cmd[],但char *cmd。它必須是單個字符串。另外,當你放入你的代碼時,它是default:而不是case default:。第四,您應該在switch語句之外聲明retcmdpath/cmdargs

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

int main(int argc, char *argv[]) { 
int f_des[2]; 

if(pipe(f_des) == -1) 
{ 
    perror("pipe"); 
    exit(1); 
} 

char *cmd; 
char *cmdargs[/*<numcmdargs>*/]; 
int ret; 

switch(fork()) 
{ 
    case -1: perror("fork"); 
     exit(2); 
    case 0: dup2(f_des[1], fileno(stdout)); 
     close(f_des[0]); 
     close(f_des[1]); 
     cmd = strcat("/usr/bin",argv[1]); 
     cmd = strcat(cmd,'\0'); 
     ret = execvp(cmd,cmdargs); 
     exit(3); 
    default: dup2(f_des[0], fileno(stdin)); 
     close(f_des[0]); 
     close(f_des[1]); 
     cmd = strcat("/usr/bin/",argv[2]); 
     cmd = strcat(cmd,'\0'); 
     ret = execvp(cmd,cmdargs); 
     exit(4); 
} 
} 

注意:這段代碼在編譯時沒有警告,但可能需要修改才能運行。 (運行時會給出Bus Error: 10)。