Ich erstelle eine Funktion, die einen vollständigen Unix-Dateinamen (wie /home/earlz/test.bin) in seine einzelnen Teile aufteilen wird. Ich habe eine Funktion, und es funktioniert für die ersten beiden Teile perfekt, aber danach produziert es fehlerhafte Ausgabe ...Teilen eines vollständigen Dateinamens in Teile
Strlcpy_char wird eine Zeichenfolge mit Begriff als Terminator, sowie 0. kopieren, wenn es ist terminiert mit term, dann ist term das letzte Zeichen der Zeichenkette, dann null.
kehrt trg String-Länge ...
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)
}
}
Ich benutze diesen Code zu testen:
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");
Wenn ich etwas versuchen, wie "/home/test.bin" es richtig funktioniert
/home /test.bin
Ausgeben Aber wenn ich versuche, "/home/earlz/test.bin" bekomme ich
/home /earlz /arlz
Jeder sieht das Problem in meinem Code, wie ich gesucht habe, aber ich sehe kein Problem.
Bevor Sie sagen, "aber es gibt eine Bibliothek dafür", mache ich das in einem Betriebssystemkernel, also habe ich kaum eine Standardbibliothek. Ich habe nur Teile von string.h und das ist wirklich Standard.
Ich glaube nicht, dass ich wie die Umsetzung das Gefühl, dass ich (wie ich hätte, oder es Hafen von irgendwo sonst auf meinem Kernel zu kompilieren) Außerdem muss mein Code einspringenden werden .. es geht um Teil des Dateisystemtreibers zu sein, der von allen Arten von Prozessen zu einem unbekannten Zeitpunkt verwendet wird ... – Earlz