我想做一个模仿UNIX中使用CD的程序。显然,最好的选择是chdir
.但是,当用户键入cd /home
时,我得到Segmentation fault
.当我使用 gdb 时,它会打印:
Program received signal SIGSEGV, Segmentation fault. __rawmemchr_avx2 () at ../sysdeps/x86_64/multiarch/memchr-avx2.S:61
61 ../sysdeps/x86_64/multiarch/memchr-avx2.S: The file of directory does not exist.
代码如下所示:
void cd(char buff[]){
if(chdir(buff)==-1){
printf("Problem with directoryn");
}
}
int main(int argc, char *argv[]){
char* token;
char buffer[256];
printf("Welcome usern");
sscanf("%s",buffer);
token=strtok(buff," ");
if(strcmp(token,"cd")==0||strcmp(token,"cdn")==0){
cd(strtok(NULL," ");
}
return 0;
}
比你的时间。
您在提供的代码中犯了一些语法和逻辑错误,例如buff
而不是main()
中的buffer
和sscanf
而不是scanf
来提供输入字符串。
另外,您写了cd(strtok(NULL," ");
但缺少右大括号以供编译此语句:cd(strtok(NULL," "));
.
我已经更正了代码,输出文件在我的平台上运行良好 - 在 Ubuntu GNU/Linux 上使用 GCC。
以下是更正后的代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void cd(char buff[]){
if(chdir(buff)==-1){
printf("Problem with directoryn");
}
}
int main(int argc, char *argv[]){
char* token;
char buffer[256];
printf("Welcome usern");
scanf("%s",buffer);
token=strtok(buffer," ");
if(strcmp(token,"cd")==0||strcmp(token,"cdn")==0){
cd(strtok(NULL," "));
}
return 0;
}
试试这个。
此代码有几个问题:
1(即使sscanf
被换成scanf
,它也不会做你可能期望它做的事情(阅读用户插入的整行(。 带有%s
scanf
将读取第一个空格。因此,您的缓冲区实际上将包含cd
,而不是像您期望的那样包含cd /home
。请改用fgets
。
2( 您必须检查strtok
是否不返回 NULL 指针。这就是当前导致段错误的原因。
像这样:
void cd(char buff[]) {
if(chdir(buff) == -1) {
printf("Problem with directoryn");
}
}
int main(int argc, char *argv[]){
char* token;
char buffer[256];
printf("Welcome usern");
// 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;
}