R – string parsing in C

cstring

I'm trying to pass a string to chdir(). But I always seem to have some trailing stuff makes the chdir() fail.

#define IN_LEN  128

int main(int argc, char** argv) {

    int counter;
    char command[IN_LEN];
    char** tokens = (char**) malloc(sizeof(char)*IN_LEN);
    size_t path_len; char path[IN_LEN];

      ...

    fgets(command, IN_LEN, stdin) 
    counter = 0;
    tmp = strtok(command, delim);
    while(tmp != NULL) {
        *(tokens+counter) = tmp;
        tmp = strtok(NULL, delim);
        counter++;
    }

    if(strncmp(*tokens, cd_command, strlen(cd_command)) == 0) {
        path_len = strlen(*(tokens+1));
        strncpy(path, *(tokens+1), path_len-1); 
    // this is where I try to remove the trailing junk... 
    // but it doesn't work on a second system
        if(chdir(path) < 0) {
            error_string = strerror(errno);
            fprintf(stderr, "path: %s\n%s\n", path, error_string);
}

// just to check if the chdir worked
char buffer[1000];
    printf("%s\n", getcwd(buffer, 1000));

    }

    return 0;
}

There must be a better way to do this. Can any help out? I'vr tried to use scanf but when the program calls scanf, it just hangs.

Thanks

Best Answer

It looks like you've forgotten to append a null '\0' to path string after calling strncpy(). Without the null terminator chdir() doesn't know where the string ends and it just keeps looking until it finds one. This would make it appear like there are extra characters at the end of your path.