我正在创建一个函数,用于将完整的Unix文件名(如/home/earlz/test.bin)拆分为其各个部分。我已经编写了一个函数,对前两个部分起作用很好,但在此之后它会产生错误的输出...
strlcpy_char将使用term作为终止符复制字符串,并且还会复制0。如果以term结尾,则term将是字符串的最后一个字符,然后是null。
返回trg字符串长度...
当我尝试类似于“/home/test.bin”这样的内容时,输出正确为:
此外,在你说“但是有一个库可以解决这个问题”之前,我要声明,我正在操作系统内核中进行操作,因此我几乎没有标准库。我只有一些string.h的部分内容,那就是所有标准库的全部了。
strlcpy_char将使用term作为终止符复制字符串,并且还会复制0。如果以term结尾,则term将是字符串的最后一个字符,然后是null。
返回trg字符串长度...
int strlcpy_char(char *trg,const char *src,int max,char term){
int i;
if(max==0){return 0;}
for(i=0;i<max-1;i++){
if(*src==0){
*trg=0;
return i;
}
if(*src==term){
*trg=term;
trg++;
*trg=0; //null terminate
return i+1;
}
*trg=*src;
src++;
trg++;
}
*trg=0;
return max;
}
.
int get_path_part(char *file,int n,char *buf){
int i;
int current_i=0;
//file is assumed to start with '/'so it skips the first character.
for(i=0;i<=n;i++){
current_i++;
current_i=strlcpy_char(buf,&file[current_i],MAX_PATH_PART_SIZE,'/');
if(current_i<=1){ //zero length string..
kputs("!"); //just a debug message. This never happens with the example
return -1; //not enough parts to the path
}
}
if(buf[current_i-1]=='/'){
return 1; //is not the last part
}else{
return 0; //is the last part(the file part)
}
}
我使用这段代码来进行测试:
kputs("test path: ");
kgets(cmd);
kputs("\n");
char *tmp=malloc(256);
int i=0;
get_path_part(cmd,i,tmp);
kputs(tmp);
kputs("\n");
i=1;
get_path_part(cmd,i,tmp);
kputs(tmp);
kputs("\n");
i=2;
get_path_part(cmd,i,tmp);
kputs(tmp);
kputs("\n");
当我尝试类似于“/home/test.bin”这样的内容时,输出正确为:
/home /test.bin但是当我尝试“/home/earlz/test.bin”时,输出为:
/home /earlz /arlz有人看出我的代码问题了吗?我一直在寻找,但就是找不到问题。
此外,在你说“但是有一个库可以解决这个问题”之前,我要声明,我正在操作系统内核中进行操作,因此我几乎没有标准库。我只有一些string.h的部分内容,那就是所有标准库的全部了。