2010-05-29 60 views
0

我有一個項目爲一個療程,我做了幾乎所有的東西,但我有這個錯誤,我不知道是誰去解決它......字符錯誤C的langauge

這樣做我們自己的殼他們中的一些,我們有項目寫我們的代碼,其他人我們會用叉子方法..

這是代碼,

#include <sys/wait.h> 
#include <dirent.h> 
#include <limits.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <string.h> 
#include<stdio.h> 
#include<fcntl.h> 
#include<unistd.h> 
#include<sys/stat.h> 
#include<sys/types.h> 

int main(int argc, char **argv) 
{ 
    pid_t pid; 
    char str[21], *arg[10]; 
    int x,status,number; 
    system("clear"); 
    while(1) 
    { 

     printf("Rshell>"); 
     fgets(str,21,stdin); 
     x = 0; 
     arg[x] = strtok(str, " \n\t"); 
     while(arg[x]) 
     arg[++x] = strtok(NULL, " \n\t"); 
     if(NULL!=arg[0]) 
     { 

      if(strcasecmp(arg[0],"cat")==0) //done 
      { 
       int f=0,n; 
        char l[1]; 
        struct stat s; 
        if(x!=2) 
        { 
          printf("Mismatch argument\n"); 


        } 
        /*if(access(arg[1],F_OK)) 
       { 
         printf("File Exist"); 
         exit(1); 
        } 
        if(stat(arg[1],&s)<0) 
        { 
         printf("Stat ERROR"); 
         exit(1); 
        } 
        if(S_ISREG(s.st_mode)<0) 
        { 
         printf("Not a Regular FILE"); 
         exit(1); 
        } 
        if(geteuid()==s.st_uid) 
         if(s.st_mode & S_IRUSR) 
          f=1; 
        else if(getegid()==s.st_gid) 
         if(s.st_mode & S_IRGRP) 
          f=1; 
        else if(s.st_mode & S_IROTH) 
         f=1; 
        if(!f) 
        { 
         printf("Permission denied"); 
         exit(1); 
        }*/ 
         f=open(arg[1],O_RDONLY); 
        while((n=read(f,l,1))>0) 
         write(1,l,n); 

      } 
      else if(strcasecmp(arg[0],"rm")==0) //done 
      { 
       if(unlink(arg[1]) != 0) 
        perror("Error deleting file"); 
       else 
       puts("File successfully deleted"); 

      } 
      else if(strcasecmp(arg[0],"rmdir")==0) //done 
      { 
       if(remove(arg[1]) != 0) 
        perror("Error deleting Directory"); 
       else 
       puts("Directory successfully deleted"); 

      } 
      else if(strcasecmp(arg[0],"ls")==0) //done 
      { 

       DIR *dir; 
       struct dirent *dirent; 
       char *where = NULL; 
       //printf("x== %i\n",x); 
       //printf("x== %s\n",arg[1]); 
       //printf("x== %i\n",get_current_dir_name()); 
       if (x == 1) 
       where = get_current_dir_name(); 
       else where = arg[1]; 

       if (NULL == (dir = opendir(where))) { 
        fprintf(stderr,"%d (%s) opendir %s failed\n", errno, strerror(errno), where); 
        return 2; 
       } 

       while (NULL != (dirent = readdir(dir))) { 
        printf("%s\n", dirent->d_name); 
       } 

       closedir(dir); 

      } 
      else if(strcasecmp(arg[0],"cp")==0) //not yet for Raed 
      { 
       FILE *from, *to; 
       char ch; 


       if(argc!=3) { 
       printf("Usage: copy <source> <destination>\n"); 
       exit(1); 
       } 

       /* open source file */ 
       if((from = fopen(argv[1], "rb"))==NULL) { 
         printf("Cannot open source file.\n"); 
         exit(1); 
       } 

       /* open destination file */ 
       if((to = fopen(argv[2], "wb"))==NULL) { 
         printf("Cannot open destination file.\n"); 
        exit(1); 
       } 

       /* copy the file */ 
       while(!feof(from)) { 
        ch = fgetc(from); 
        if(ferror(from)) 
        { 
         printf("Error reading source file.\n"); 
          exit(1); 
        } 
        if(!feof(from)) fputc(ch, to); 
         if(ferror(to)) { 
          printf("Error writing destination file.\n"); 
          exit(1); 
        } 
       } 

       if(fclose(from)==EOF) { 
        printf("Error closing source file.\n"); 
        exit(1); 
       } 

       if(fclose(to)==EOF) { 
        printf("Error closing destination file.\n"); 
        exit(1); 
       } 

      } 
      else if(strcasecmp(arg[0],"mv")==0)//done 
      { 
       if(rename(arg[1],arg[2]) != 0) 
        perror("Error moving file"); 
       else 
       puts("File successfully moved"); 

      } 
      else if(strcasecmp(arg[0],"hi")==0)//done 
      { 

       printf("hello\n"); 
      } 
      else if(strcasecmp(arg[0],"exit")==0) // done 
      { 

       return 0; 

      } 
      else if(strcasecmp(arg[0],"sleep")==0) // done 
      { 

       if(x==1) 
       printf("plz enter the # seconds to sleep\n"); 
       else 
       sleep(atoi(arg[1])); 
      } 
      else if(strcmp(arg[0],"history")==0) // not done 
      { 
       FILE *infile; 
       //char fname[40]; 
       char line[100]; 
       int lcount; 
       ///* Read in the filename */ 
       //printf("Enter the name of a ascii file: "); 
       //fgets(History.txt, sizeof(fname), stdin); 

       /* Open the file. If NULL is returned there was an error */ 
       if((infile = fopen("History.txt", "r")) == NULL) 
       { 
         printf("Error Opening File.\n"); 
         exit(1); 
       } 

       while(fgets(line, sizeof(line), infile) != NULL) { 
        /* Get each line from the infile */ 
         lcount++; 
         /* print the line number and data */ 
         printf("Line %d: %s", lcount, line); 
       } 

       fclose(infile); /* Close the file */ 
       writeHistory(arg); 
       //write to txt file every new executed command 
       //read from the file once the history command been called 
       //if a command called not for the first time then just replace it to the end of the file 
      } 
      else if(strncmp(arg[0],"@",1)==0) // not done 
      { 
       //scripting files 
       // read from the file command by command and executing them 
      } 
      else if(strcmp(arg[0],"type")==0) //not done 
      { 

       //if(x==1) 
       //printf("plz enter the argument\n"); 
       //else 
       //type((arg[1])); 
      } 
      else 
      { 

       pid = fork(); 

       if (pid == 0) 
       { 
        execlp(arg[0], arg[0], arg[1], arg[2], NULL); 
        printf ("EXEC Failed\n"); 
       } 
       else 
       { 

        wait(&status); 
        if(strcmp(arg[0],"clear")!=0) 
        { 
         printf("status %04X\n",status); 
         if(WIFEXITED(status)) 
          printf("Normal termination, exit code %d\n", WEXITSTATUS(status)); 
         else 
          printf("Abnormal termination\n"); 
        } 
       } 

      } 

     } 
    } 
} 
void writeHistory(char *arg[]) 
{ 
    FILE *file; 
    file = fopen("History.txt","a+"); /* apend file (add text to 
    a file or create a file if it does not exist.*/ 
    int i =0; 
    while(strcasecmp(arg[0],NULL)==0) 
    { 
     fprintf(file,"%s ",arg[i]); /*writes*/ 
    } 
    fprintf(file,"\n"); /*new line*/ 
    fclose(file); /*done!*/ 
    getchar(); /* pause and wait for key */ 
    //return 0; 
} 

的事情是,當我編譯代碼,這是什麼給了我

/home/ugics/st255375/ICS431Labs/Project/Rshell.c: At top level: 
/home/ugics/st255375/ICS431Labs/Project/Rshell.c:264: warning: conflicting types for ‘writeHistory’ 
/home/ugics/st255375/ICS431Labs/Project/Rshell.c:217: note: previous implicit declaration of ‘writeHistory’ was here 

任何一個能幫助我嗎?

感謝

+0

前只需添加

void writeHistory(char *arg[]); 

能否請您格式化一個可讀的方式代碼? – mariosangiorgio 2010-05-29 20:26:46

+0

此外,請儘量刪除代碼的不相關部分,尤其是註釋掉的部分,這只是把空間,使其更難以瞭解你的代碼和重點問題。只發布仍然會再現問題的最小代碼量。這會增加您獲得幫助的機會:-) – 2010-05-29 20:40:17

+0

與您的問題無關;錯誤消息如果包含文件名則更好。例如,代替 'PERROR( 「錯誤刪除文件」);',嘗試 'PERROR(ARG [1])' 或「fprintf中(錯誤, 「錯誤刪除%S:%S」,則arg [1],字符串錯誤(錯誤));」 – 2010-05-30 13:58:30

回答

1

首先,您的通話WriteHistory期待指針數組,但你只有通過在一個單一的字符指針變量它。

你得到一個奇怪的消息,因爲你不使用它之前宣佈的功能,所以當它到達WriteHistory的定義,它不匹配,你前面進行調用。

+0

所以我應該如何以正確的方式做到這一點? – 2010-05-29 20:34:48

+0

首先,將WriteHistory的聲明添加到源文件的頂部。其次,弄清楚你想傳遞給它的是什麼,並修復函數或者你在main()中調用它的地方。 – Joe 2010-05-29 20:37:52

+0

okey,解決了前一個,但現在它給了我這個錯誤 void writeHistory(char * arg []) { \t FILE * file; \t文件=的fopen( 「History.txt」, 「A +」);/* apend文件(文本添加到 \t文件或創建如果它不存在它一個文件*/ \t INT I = 0; \t而(strcasecmp(ARG [0],NULL)== 0) \t { \t \t fprintf中(文件, 「%s」 時,則arg [I]);/*寫入*/ \t} \t fprintf中(文件, 「\ n」);/*新線路*/ \t FCLOSE(文件);/*完成!*/ \t getchar();/*暫停並等待密鑰*/ \t //返回0; } – 2010-05-29 20:41:00