for(p=path+strlen(path); p >= path && *p != '/'; p--) ; p++;
时间: 2024-01-31 13:03:58 浏览: 38
这是一段 C 语言代码,它的功能是找到路径字符串中最后一个斜杠后面的子串。具体解释如下:
- `path` 是路径字符串的指针。
- `path+strlen(path)` 是指向路径字符串最后一个字符的指针,也就是指针的初始值。
- 循环条件是 `p >= path && *p != '/'`,即指针 `p` 必须在路径字符串的范围内,且当前字符不是斜杠。
- 循环体为空,只是移动指针 `p`。
- 循环结束后,指针 `p` 指向最后一个斜杠后面的子串的起始位置。
注意,如果路径字符串中没有斜杠,指针 `p` 会指向字符串的结尾,此时需要特殊处理。
相关问题
strcpy(buf, path); p = buf + strlen(buf); *p++ = '/'; while (read(fd, &de, sizeof(de)) == sizeof(de)){ if (de.inum == 0) continue; memmove(p, de.name, DIRSIZ); p[DIRSIZ] = 0; if (strcmp(de.name, ".") == 0 || strcmp(de.name, "..") == 0) continue; //如果进入文件夹..或者.则退出此次循环 find(buf, filename); }
这段代码的作用是在给定的路径(path)下递归查找特定文件(filename)。首先,它将路径复制到一个缓冲区(buf)中,并将指针(p)指向缓冲区的末尾。然后,在循环中,它读取指定文件描述符(fd)的目录项(de),如果目录项的inode号为0,则跳过此次循环。接下来,它将目录项的名称(de.name)复制到缓冲区的末尾,并在末尾添加一个斜杠(/)。然后,它检查目录项的名称是否为“.”或“..”,如果是,则继续下一次循环。最后,它递归调用自身,以进入新目录(buf)并继续查找文件。
void cd(char* name)//切换目录 { int fileInodeNum; PtrInode fileInode=(PtrInode)malloc(inodeSize);// if(strcmp(name,"..")==0)//返回上一级目录 { fseek(fp,superBlockSize+nowDir*inodeSize,SEEK_SET);//?? fread(fileInode,inodeSize,1,fp);//?? nowDir=fileInode->iparent; char temp[80]=""; int cnt=0; for(int i=strlen(path)-1;i>=0;i--) { cnt++; if(path[i]=='\\') break; } strncpy(temp,path,strlen(path)-cnt);//?? strcpy(path,temp); } else if(strcmp(name,'\\'==0))//返回根目录 { fseek(fp,superBlockSize,SEEK_SET); fread(fileInode,inodeSize,1,fp); nowDir=fileInode->iparent; strcpy(path,""); } else { char* subName; subName=strtok(name,"\\");//分隔 while(subName!=NULL) { fileInodeNum=findInodeNum(subName,1); if(fileInodeNum==-1) { cout<<"目录不存在!"<<endl; break; } else { nowDir=fileInodeNum; strcat(path,"\\");//连接字符串 strcat(path,subName); } subName=strtok(NULL,"\\"); } } free(fileInode); }改bug
在第12行,if语句中的判断条件应该改为`if(strcmp(name,"..")==0)`,将单引号改为双引号。
在第14行,`char temp[80]`的声明应该移到if语句外部,否则会导致变量作用域错误。
在第19行,`strncmp(temp,path,strlen(path)-cnt)`的第三个参数应该改为`cnt`,表示截取path的末尾cnt个字符。
修改后的代码如下:
```
void cd(char* name) //切换目录
{
int fileInodeNum;
PtrInode fileInode=(PtrInode)malloc(inodeSize);
if(strcmp(name,"..")==0) //返回上一级目录
{
fseek(fp,superBlockSize+nowDir*inodeSize,SEEK_SET);
fread(fileInode,inodeSize,1,fp);
nowDir=fileInode->iparent;
char temp[80];
int cnt=0;
for(int i=strlen(path)-1;i>=0;i--)
{
cnt++;
if(path[i]=='\\')
break;
}
strncpy(temp,path,strlen(path)-cnt);
temp[strlen(path)-cnt]='\0';
strcpy(path,temp);
}
else if(strcmp(name,"\\")==0) //返回根目录
{
fseek(fp,superBlockSize,SEEK_SET);
fread(fileInode,inodeSize,1,fp);
nowDir=fileInode->iparent;
strcpy(path,"");
}
else
{
char* subName;
subName=strtok(name,"\\");
while(subName!=NULL)
{
fileInodeNum=findInodeNum(subName,1);
if(fileInodeNum==-1)
{
cout<<"目录不存在!"<<endl;
break;
}
else
{
nowDir=fileInodeNum;
strcat(path,"\\");
strcat(path,subName);
}
subName=strtok(NULL,"\\");
}
}
free(fileInode);
}
```