我在 C 中更改目录时分段错误



我想做一个模仿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()中的buffersscanf而不是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,它也不会做你可能期望它做的事情(阅读用户插入的整行(。 带有%sscanf将读取第一个空格。因此,您的缓冲区实际上将包含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;
}

相关内容

  • 没有找到相关文章