У этого кода есть несколько проблем:
1), даже если sscanf
поменялся местами на scanf
, он не будет делать то, что вы, вероятно, ожидаете (прочитайте всю строку, вставленную пользователем). scanf
с %s
будет считывать до первого пробела. Таким образом, ваш буфер будет содержать cd\0
вместо cd /home\0
, как вы ожидаете. Вместо этого используйте fgets
.
2) Необходимо убедиться, что strtok
не возвращает указатель NULL. Это то, что в настоящее время вызывает ваш segfault.
Примерно так:
void cd(char buff[]) {
if(chdir(buff) == -1) {
printf("Problem with directory\n");
}
}
int main(int argc, char *argv[]){
char* token;
char buffer[256];
printf("Welcome user\n");
// reads the whole line into buffer
fgets(buffer, 256, stdin);
token = strtok(buffer, " ");
if (strcmp(token, "cd") == 0){
token = strtok(NULL," ");
// we must check if there are any tokens left
if (token != NULL) {
// we must remove the trailing newline character that is included by fgets
cd(strtok(token, "\n"));
}
}
return 0;
}