Char ошибка C язык - PullRequest
       23

Char ошибка C язык

0 голосов
/ 30 мая 2010

У меня есть проект для курса, я сделал почти все, но у меня есть эта ошибка.

проект о создании собственной оболочки, некоторые из них мы должны написать наш код, другие мы будем использовать метод fork.

это код,

#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

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Во-первых, ваш вызов WriteHistory ожидает массив указателей, но вы передаете ему только одну переменную-указатель на символ.

Вы получаете странное сообщение, потому что вы не объявляете функцию до ее использования, поэтому, когда она достигает определения WriteHistory, она не соответствует вызову, который вы делали ранее.

0 голосов
/ 30 мая 2010

Просто добавьте

void writeHistory(char *arg[]);

до основного объявления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...