完全な UNIX ファイル名 (/home/earlz/test.bin など) を個々の部分に分割する関数を作成しています。関数があり、最初の2つの部分は完璧に機能しますが、その後は誤った出力が生成されます...
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」のようなものを試すと、正しく出力されます
/家 /test.bin
しかし、「/home/earlz/test.bin」を試してみると、
/家 /earlz /arlz
私が探していたように、誰もが私のコードに問題を見ていますが、問題は見当たりません。
また、「でもそのためのライブラリはある」と言う前に、私はオペレーティング システム カーネルでこれを行っているため、標準ライブラリはほとんどありません。私はstring.hの一部しか持っていませんが、実際にはそれが標準です。