Я создаю функцию, которая разделит полное имя файла Unix (например, /home/earlz/test.bin) на отдельные части. У меня есть функция, и она отлично работает для первых двух частей, но после этого выдает ошибочный вывод ...
strlcpy_char скопирует строку, используя термин в качестве терминатора, а также 0.
Если оно заканчивается термином, то термин будет последним символом строки, а затем будет нулевым.
возвращает длину строки 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, и на самом деле это стандартно.