※ ChatGPTを利用し、要約された質問です(原文:Unix 系 OS の標準的コマンドの一つである ls をまねたプログ)
Unix系OSでlsコマンドをまねたプログラムの質問
このQ&Aのポイント
Unix系OSの標準的コマンドであるlsをまねたプログラムを作成中。
コマンド"fl"の引数にディレクトリが指定された場合に、ファイル名の前にディレクトリ名を付加して表示するプログラムを作成中。
スラッシュ除去する部分まではできたが、メイン関数に返す方法がわからない。strcpy関数を使用してもコンパイルエラーが発生する。
Unix 系 OS の標準的コマンドの一つである ls をまねたプログ
Unix 系 OS の標準的コマンドの一つである ls をまねたプログラムを作っているのですが、そのことについて質問があります。
コマンド“fl”の引数にディレクトリが指定された場合に、ファイル名の前にディレクトリ名を付加して表示するプログラムをつくっています。
条件として、
・表示するときは、ファイル名だけでなく指定されたディレクトリ名を ファイル名の前に付加したものを表示(パス表示)する。
・指定されたディレクトリの最後にスラッシュがない場合でも、スラッシュを付与して表示する。
・引数へ与えるディレクトリ名として
///home//sakai////hoge//////
のように指定した場合も、ls と同様、該当するディレクトリ配下のファイルを表示する。
・コマンドの引数にディレクトリ名が指定されない場合はカレントディレクトリのファイル名のみ表示し、 ディレクトリ名は付加しない。ただし、ファイルへ付加するディレクトリ名は 余分なスラッシュを除去したものである。
・文字列と文字列の連結には strcat関数を使用する。
・余分なスラッシュを除去する部分の実装はmain関数内ではなく、別の関数する。
この条件で途中まで作ってみたのですが、
char pathpath(char *str)
{
int i,j,flag;
char x1[512] = {0};
char x2[512] = {0};
flag = 0;
printf("%s\n", str);
j = 0;
strcpy(x1, str);
for(i = 0; i < strlen(x1); i++)
{
if((x1[i] != '/') && (flag == 0))
{
x2[j] = x1[i];
j++;
}
else if((x1[i] == '/') && (flag == 0))
{
x2[j] = x1[i];
j++;
flag = 1;
}
else if((x1[i] == '/') && (flag == 1))
{
continue;
}
else if((x1[i] != '/') && (flag == 1))
{
x2[j] = x1[i];
j++;
flag = 0;
}
}
if(flag == 0)
{
strcat(x2, "/");
}
strcat(x2, "\0");
printf("%s\n", x2);
strcpy(str, x2);
return *str;
}
で、スラッシュ除去する部分まではできたのですが、スラッシュ除去したものをメイン関数に
*x = pathpath(argv[i + 1]);
と返そうとするとうま返りませんし、strcpy関数を用いて、
strcpy(path[i], pathpath(argv[i + 1]));
にしようとするとコンパイルすらうまくできません。
ちなみに、メイン関数の宣言部は、
int main(int argc, char *argv[])
{
int i;
DIR *dir[argc];
char path[argc][512],*x;
struct dirent *de[argc];
struct dirent_cell *cell, *head;