函数chdir()的行为异常 int cmd_cd(char*argv[]{ 如果(argv[1]==NULL | | strncmp(“~”,argv[1],1)==0){ 结构passwd*pw=getpwuid(getuid()); if(argv[1]==NULL | | strlen(argv[1])==1){ argv[1]=pw->pw_dir; } 否则{ 字符路径[strlen(pw->pw_dir)+strlen(arg[1]); strcpy(路径,pw->pw_dir); argv[1]=&argv[1][1]; strcat(路径,argv[1]); argv[1]=路径; } } 如果退出块时删除了(chdir(argv[1])

函数chdir()的行为异常 int cmd_cd(char*argv[]{ 如果(argv[1]==NULL | | strncmp(“~”,argv[1],1)==0){ 结构passwd*pw=getpwuid(getuid()); if(argv[1]==NULL | | strlen(argv[1])==1){ argv[1]=pw->pw_dir; } 否则{ 字符路径[strlen(pw->pw_dir)+strlen(arg[1]); strcpy(路径,pw->pw_dir); argv[1]=&argv[1][1]; strcat(路径,argv[1]); argv[1]=路径; } } 如果退出块时删除了(chdir(argv[1]),c,linux,shell,chdir,C,Linux,Shell,Chdir,路径,则定义该路径 试试这个: int cmd_cd(char* argv[]) { if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){ struct passwd *pw = getpwuid(getuid()); if(argv[1] == NULL || strlen(argv[1]) == 1){ argv[1] = pw->pw_dir; } else{ char

路径
,则定义该路径

试试这个:

int cmd_cd(char* argv[]) {
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      char path[strlen(pw->pw_dir) + strlen(arg[1])];
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    return -1;
  }
  return 0;
}
int cmd_cd(char*argv[]{
char*path=NULL;
如果(argv[1]==NULL | | strncmp(“~”,argv[1],1)==0){
结构passwd*pw=getpwuid(getuid());
if(argv[1]==NULL | | strlen(argv[1])==1){
argv[1]=pw->pw_dir;
}
否则{
path=malloc(strlen(pw->pw_dir)+strlen(arg[1]);
if(路径==NULL){
printf(“内存分配失败\n”);
返回-1;
}
strcpy(路径,pw->pw_dir);
argv[1]=&argv[1][1];
strcat(路径,argv[1]);
argv[1]=路径;
}
}

如果退出块时删除了(chdir(argv[1])
路径
,则定义该路径

试试这个:

int cmd_cd(char* argv[]) {
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      char path[strlen(pw->pw_dir) + strlen(arg[1])];
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    return -1;
  }
  return 0;
}
int cmd_cd(char*argv[]{
char*path=NULL;
如果(argv[1]==NULL | | strncmp(“~”,argv[1],1)==0){
结构passwd*pw=getpwuid(getuid());
if(argv[1]==NULL | | strlen(argv[1])==1){
argv[1]=pw->pw_dir;
}
否则{
path=malloc(strlen(pw->pw_dir)+strlen(arg[1]);
if(路径==NULL){
printf(“内存分配失败\n”);
返回-1;
}
strcpy(路径,pw->pw_dir);
argv[1]=&argv[1][1];
strcat(路径,argv[1]);
argv[1]=路径;
}
}

如果(chdir(argv[1])此处指定的值

int cmd_cd(char* argv[]) {
  char *path = NULL;
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
      if (path == NULL){
        printf("Memory allocation failed\n");
        return -1;
      }
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    if (path != NULL) free(path);
    return -1;
  }
  if (path != NULL) free(path);
  return 0;
}
在这里不再有效了

argv[1] = path;

if(chdir(argv[1])此处指定的值

int cmd_cd(char* argv[]) {
  char *path = NULL;
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
      if (path == NULL){
        printf("Memory allocation failed\n");
        return -1;
      }
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    if (path != NULL) free(path);
    return -1;
  }
  if (path != NULL) free(path);
  return 0;
}
在这里不再有效了

argv[1] = path;

if(chdir(argv[1])下面有任何路径,或者只有一些路径?当它失败时,
errno
中设置了什么值?如果“argv”具有通常的含义,则它位于只读内存中,因此运行此操作的结果将是seg故障事件。
strncmp(“~”,argv[1],1)=0)
如果您将其编写为:
argv[1][0]='~'
问题是关于运行时的问题。因此,代码必须干净地编译、可执行并显示问题。发布的代码不满足这些要求criteria@user3629249:
main()
char**
“字符串”不是常量或只读。有任何路径在下面或只有一些路径?当它失败时,
errno
中设置了什么值?如果“argv”具有通常的含义,则它位于只读内存中,因此运行此操作的结果将是seg故障事件。
strncmp(“~”,argv[1],1)==0)
如果您将其编写为:
argv[1][0]='~'
问题是关于运行时的问题。因此,代码必须干净地编译、可执行并显示问题。发布的代码不满足这些要求criteria@user3629249:
main()
char**
“字符串”不是常量或只读。在空指针上调用
free()
时不需要此测试
if(path!=NULL)
,因为对空指针调用
free()
时定义良好。在空指针上调用
free()
时不需要此测试
if(path!=NULL)