C Linux:警告:赋值在没有强制转换的情况下从指针生成整数[默认启用]

时间:2014-12-03 17:26:25

标签: c linux

我尝试在代码的不同位置上投射(char *),但没有任何帮助...... 我也有以下错误:

OSCourseProject1.c: In function ‘main’:
OSCourseProject1.c:18:21: warning: assignment makes integer from pointer without a cast                       [enabled by default]
singleUserCommand = strtok(tempUserCommands," ");
                 ^
OSCourseProject1.c:19:29: warning: comparison between pointer and integer [enabled by     default]
while ( singleUserCommand != NULL )
                         ^
OSCourseProject1.c:21:4: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
if ( strcmp( singleUserCommand, "leave") != 0 )
^
In file included from OSCourseProject1.c:2:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
        ^
OSCourseProject1.c:25:5: warning: passing argument 2 of ‘strcmp’ makes pointer from     integer without a cast [enabled by default]
 while ( strcmp(tempShellPath, singleUserCommand)==0 &&
 ^
In file included from OSCourseProject1.c:2:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type     ‘char’
extern int strcmp (const char *__s1, const char *__s2)
        ^
OSCourseProject1.c:33:8: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
singleUserCommand);
    ^
OSCourseProject1.c:45:24: warning: assignment makes integer from pointer without a cast [enabled by default]
singleUserCommand = (char*)strtok(NULL, " ");
                    ^
/tmp/ccAuy2Eg.o: In function `main':
OSCourseProject1.c:(.text+0x11): undefined reference to `getnv'
collect2: error: ld returned 1 exit status

这是我写的代码(我应该从用户那里收到一行命令 按命令分解它们并分别运行每个命令。

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

main ()
{
    char * shellPath = (char *)getnv("PATH");
    char * tempShellPath, singleUserCommand;
    char * singleShellCommand;
    char * userCommands = (char*)malloc(100);
    char * tempUserCommands = (char*)malloc(100);
    int forker, runOrDie = 1;
    while (runOrDie)
    {
        printf("<Please enter a command>");
        fgets(userCommands, 100, stdin);
        strcpy(tempUserCommands, userCommands);
        singleUserCommand = strtok(tempUserCommands," ");
        while ( singleUserCommand != NULL )
        {
            if ( strcmp( singleUserCommand, "leave") != 0 )
            {
                strcpy( (char*)tempShellPath, (char*)shellPath);
                singleShellCommand = (char*)strtok(tempShellPath, ":");
                while ( strcmp(tempShellPath, singleUserCommand)==0 &&
                    singleShellCommand != NULL )
                {
                    singleShellCommand = strtok(NULL, ":");
                }
                if ( singleShellCommand == NULL)
                {
                    printf("%s - no such command exists!", 
                            singleUserCommand);
                }
                else
                {
                    if ( (forker = fork()) == 0 )
                    {
                        execv(singleShellCommand, singleUserCommand);
                    }
                    else
                    {
                        wait( &forker );
                    }
                    singleUserCommand = (char*)strtok(NULL, " ");
                }
            }
            else
            {
                runOrDie = 0;
            }
        }
    }
} 

2 个答案:

答案 0 :(得分:3)

char * tempShellPath, singleUserCommand;

这将是

char *tempShellPath;
char singleUserCommand;

您需要的是:

char *singleUserCommand;

答案 1 :(得分:0)

rather than trying to list all the problems via comments.
(your original code yielded some 60 errors/warnings)
the following code will compile with no errors/warnings
Do read the notes in the file (most notes contain '<--'
Do notice the error checking
Do notice the new function cleanUp() to assure no memory leaks
Do notice that second parameter in call to execv() still needs fixing

always place literal on left when performing a comparison
     so compiler catches '=' .vs. '==' errors
use meaningful names
use proper return value typing and error checking

// <-- added missing header files
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // pid_t definition

#include <sys/types.h>
#include <sys/wait.h> // wait() prototype


#define MAX_USER_COMMANDS_LEN (100) // <-- so changing size easy and no magic number in code

// pointers here so visible to cleanUp and main
char * shellPath          = NULL;
char * tempShellPath      = NULL;
char * userCommands       = NULL;
char * tempUserCommands   = NULL;
char * singleUserCommand  = NULL;
char * singleShellCommand = NULL;

// prototypes
void cleanUp( void ); // <-- new function

int main () // <-- corrected 
{
    pid_t  childPid; // <-- corrected
    int    pidStatus; // status set by wait() // <-- corrected

    if( NULL == (shellPath = getenv("PATH")) ) // <-- added error checking
    { // then getenv failed
        perror( "getenv failed for PATH" );
        cleanUp();
        exit( EXIT_FAILURE );
    }

    // implied else, getenv successful

    if( NULL == (userCommands = malloc(MAX_USER_COMMANDS_LEN)) ) // <-- added error checking
    { // then, malloc failed
        perror( "malloc failed for userCommands" );
        cleanUp();
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    if( NULL == (tempShellPath = malloc( strlen(shellPath) +1) ) ) // added error checking
    { // then malloc failed
        perror( "malloc failed for tempShellPath" );
        cleanUp();
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    while (1)
    {
        printf("<Please enter a command>");
        if( NULL == fgets(userCommands, 100, stdin) ) // <-- added error checking
        { // then fgets failed
            perror( "fgets failed for userCommands" );
            cleanUp();
            exit( EXIT_FAILURE );
        }

        // implied else, fgets successful

        if( NULL == (tempUserCommands = malloc( strlen( userCommands )+1) ) ) // <-- added error checking
        { // then malloc failed
            perror( "malloc failed" );
            cleanUp();
            exit( EXIT_FAILURE );
        }

        // implied else, malloc successful

        strcpy(tempUserCommands, userCommands);
        singleUserCommand = strtok(tempUserCommands," ");

        while ( NULL != singleUserCommand )
        {

            // note: suggest: 'quit' or 'q' as intuitive rather than 'leave'
            if ( 0 == strcmp( singleUserCommand, "leave")  ) break; // exit while loop

            // +++++++++++++++++++++++++++++++++++++++++++++++++
            // replace following with something reasonable
            // perhaps a 'whereis' kind of call
            // note: shellPath is a series of directory paths, not executables separated by ':'
            //
            // strcpy( tempShellPath, shellPath);
            // singleShellCommand = (char*)strtok(tempShellPath, ":");
            // while (
            //     ( strcmp(tempShellPath, singleUserCommand)==0)
            //     &&
            //      (singleShellCommand != NULL) )
            // {
            //    singleShellCommand = strtok(NULL, ":");
            // }
            //
            // if ( singleShellCommand == NULL)
            // {
            //    printf(" - no command entered!\n");
            // }
            //
            // else
            // {
                if ( 0 == (childPid = fork()) )
                { // then child
                    // ERROR: singleUserCommand(in the following line)
                    //        must be an array of pointers to strings,
                    //        with a final pointer of NULL
                    if( -1 == execv(singleShellCommand, (char * const*)singleUserCommand) )
                    { // command failed // <-- added error checking
                        perror( "execv failed" );
                        cleanUp();  // test to assure this is 'ok' to use here
                        exit( EXIT_FAILURE ); // execv should never return
                    }
                }

                else
                { // else parent
                    wait( &pidStatus ); // wait for only child to complete
                } // end if

                singleUserCommand = strtok(NULL, " ");
            // } // end if
        } // end while
        free( tempUserCommands ); tempUserCommands = NULL; // <-- prep for next pass through loop
    } // end while

    cleanUp(); // < -- added free of malloc'd areas
    return(0); // <-- added proper return statement
} // end function: main

// <-- added following function to assure no memory leaks
void cleanUp()
{
    free( tempShellPath ); tempShellPath = NULL;
    free( userCommands ); userCommands = NULL;
    free( tempUserCommands ); tempUserCommands = NULL;
} // end function: cleanUp