C言語関係掲示板

過去ログ

No.353.文字列を降順に並べる

[戻る] [ホームページ]

No.2328

降順の仕方は、どうやるんですか?
投稿者---達也(2002/08/07 17:46:02)


1  佐藤        左のようなものを下からならべるには、
2  伊藤        C言語では、どのようにしたらよいので
3  鈴木        しょうか?
4  加藤
5  渡辺
6  菊池
7  平塚



No.2329

Re:降順の仕方は、どうやるんですか?
投稿者---かずま(2002/08/07 18:46:18)


>1  佐藤        左のようなものを下からならべるには、
>2  伊藤        C言語では、どのようにしたらよいので
>3  鈴木        しょうか?
>4  加藤
>5  渡辺
>6  菊池
>7  平塚

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    static char buf[1024];

    while (fgets(buf, sizeof buf, stdin)) {
        char *p = strdup(buf);
        if (p == NULL) {
            fprintf(stderr, "out of memory\n");
            exit(1);
        }
        main();
        fputs(p, stdout);
    }
    return 0;
}

このプログラム revline.c とし、
これをコンパイルしてできたものを revline.exe とし、
逆順に並べ替えたいデータのファイルを data.txt とすると、

 revline <data.txt

で、並べ替えたデータが表示されます。

 revline <data.txt >result.txt

で、並べ替えたデータをファイルにすることもできます。



No.2330

Re:降順の仕方は、どうやるんですか?
投稿者---かずま(2002/08/07 20:02:55)


>    while (fgets(buf, sizeof buf, stdin)) {

を
    if (fgets(buf, sizeof buf, stdin) {

に訂正します。while でも動くけど、2度目の fgets は必ず NULL を返すから
if で十分です。


No.2332

Re:降順の仕方は、どうやるんですか?
投稿者---とおり(2002/08/07 20:43:53)


strdup、私は初めてみたのですが、調べてみたところ下記のような関数でした。
実装されてない環境も多そうなので補足ということで載せておきます。
fputsのあとにfree(p)を入れておくと尚よさそうですね。

char *strdup(char *s)
{
  char *p;
  p = malloc(strlen(s) + 1);
  if (p != NULL)
    strcpy(p, s);
  return p;
}

かずまさんのプログラムを見て、ふと学校で習ったLispを思い出しました。
再起って楽しいですよね。


あと、私には下記の部分は不要に思えたのですがどうなんでしょうか?
fputs(p, stdout)のpをbufにしておけばよさそうに思えます。

    char *p = strdup(buf);
    if (p == NULL) {
      fprintf(stderr, "out of memory\n");
      exit(1);
    }


No.2333

Re:降順の仕方は、どうやるんですか?
投稿者---かずま(2002/08/07 22:29:15)


> strdup、私は初めてみたのですが、調べてみたところ下記のような関数でした。
> 実装されてない環境も多そうなので補足ということで載せておきます。

確かに strdup は C の標準規格には含まれていません。
しかし、ほとんどすべての処理系に実装されています。

LSI C-86, Borland C++, Visual C++, gcc(cygwin, Linux, FreeBsd)
Solaris(SunOS), NEWS-OS, ...

私は、strdup のない処理系を、今は知りません。ご存知でしたら教えてください。


> fputsのあとにfree(p)を入れておくと尚よさそうですね。

入れてもかまいませんが、入れる必要はありません。このプログラムは
すぐに終了してしまい、free した領域は再利用されませんから。
プログラムが終了すると、ヒープも、スタックも、静的データ領域も、コード
の領域も、すべてのメモリーは OS に返却されるので、メモリーリークが起こ
ることはありません。Unix や Windows はもちろん、MS-DOS や CP/M ですら、
メモリーリークは起こりえません。
free しないと、不具合が生じるシステムをご存知でしたら教えてください。


> かずまさんのプログラムを見て、ふと学校で習ったLispを思い出しました。
> 再起って楽しいですよね。

再帰(recursion)です。


> あと、私には下記の部分は不要に思えたのですがどうなんでしょうか?
> fputs(p, stdout)のpをbufにしておけばよさそうに思えます。

buf は、static なので、fputs するときには、もう内容は残っていません。

static 宣言しなければよいのですが、そうすると、スタックをどんどん消費
していって、recursive call できる回数が少なくなります。

No.2342

Re:降順の仕方は、どうやるんですか?
投稿者---とおり(2002/08/08 20:11:07)


なるほどなるほど。
返信ありがとうございました。