みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;

投稿日時 - 2010-06-18 15:39:48

QNo.5977552

すぐに回答ほしいです

質問者が選んだベストアンサー

型宣言が char * と、return *str を return str; に。
それはいいとして、

> DIR *dir[argc];

これはできません。定数にするか必要なら malloc() で確保します。でも各ディレクトリごとに処理するなら、配列はそもそも必要ない気がします。

それに余分なスラッシュを除去するだけなら、一時バッファを使わなくとも

trimslash(char *str)
{
char *p = str;

while (*str++ = *p++)
while (*p == '/' && *(p - 1) == *p)
p++;
}

ぐらいじゃないかと。確かめてませんが。

投稿日時 - 2010-06-18 17:32:24

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

関数の中まで詳しく見てませんが、

> char pathpath(char *str)

char *pathpath(char *str)

としたいんじゃないですか?
そうであれば、当然returnの部分も変更する必要があります。

投稿日時 - 2010-06-18 15:51:12

あなたにオススメの質問