【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22940

配列のアクセス方法
投稿者---CENTER(2005/09/02 12:36:25)


読んだ行のデータを配列に蓄えてからqsort()関数に渡して整列さえる方法

/*
 * sort1.c - 標準入力からの行を昇順に整列
 */

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

#define LINE_SIZE (256 + 2) /* 1行の最大文字数+'\n'+'\0' */
#define MAX_LINES 100       /* 最大行数 */

int read_line(FILE *);
void write_line(FILE *, int);

char line[MAX_LINES][LINE_SIZE];

main(int argc. char **argv)
{
    int n;
    n = read_line(stdin); /* 入力 */
    qsort(line, n, LINE_SIZE, strcmp); /* 整列 */
    write_line(stdout, n); /* 出力 */
    return (0);
}

int read_line(FILE *fp)
{
    char tmp[LINE_SIZE];
    int n;

    for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++) {
        if (n < MAX_LINES)
           strcpy(line[n], tmp);
        else {
           fprintf(stderr, "too much lines\n");
           exit(1); /* abnormal terminate */
        }
    }
    return (n);
}

void write_line(FILE *fp, int n)
{
    int i;

    for (i = 0; i < n; i++)
        fputs(line[i], fp);
}


#define LINE_SIZE (256 + 2) /* 1行の最大文字数+'\n'+'\0' */
#define MAX_LINES 100 /* 最大行数 */

char line[MAX_LINES][LINE_SIZE];

上記のように宣言されているのにline[n]というアクセス方法があるの
ですが、これでもアクセスできるのでしょうか?

int read_line(FILE *);の中身で、これは、1行を読み込む関数ですか?
それともこれで、数行を読み込めますか?
for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++)
上記の条件だと思うのですが、NULLまでで終了になってますね。
一行に、NULLというのが含まれていますよね、ということは、1行まで
しか読めないきがするのですが・・・間違ってますか?



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列のアクセス方法 22941 とおり 2005/09/02 13:10:40
<子記事> Re:配列のアクセス方法 22942 通りすがって 2005/09/02 13:18:06
<子記事> Re:配列のアクセス方法 22945 TT414 2005/09/02 16:05:10


No.22941

Re:配列のアクセス方法
投稿者---とおり(2005/09/02 13:10:40)


>int read_line(FILE *);の中身で、これは、1行を読み込む関数ですか?
>それともこれで、数行を読み込めますか?
>for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++)
>上記の条件だと思うのですが、NULLまでで終了になってますね。
>一行に、NULLというのが含まれていますよね、ということは、1行まで
>しか読めないきがするのですが・・・間違ってますか?

違います。
fgets()はエラーが発生するか、またはファイルの終端に達すると、NULL を返します。
つまり、
> for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++)
はファイルの終端に達するまで、読込みを繰り返します。


この投稿にコメントする

削除パスワード

No.22942

Re:配列のアクセス方法
投稿者---通りすがって(2005/09/02 13:18:06)


><pre>読んだ行のデータを配列に蓄えてからqsort()関数に渡して整列さえる方法

>char line[MAX_LINES][LINE_SIZE];
>
>上記のように宣言されているのにline[n]というアクセス方法があるの
>ですが、これでもアクセスできるのでしょうか?
問題ありません。もし、line[0]に"japan"という文字列が含まれているならば line[0][0] = 'j', line[0][1] = 'a' line[0][2] = 'p' と、いうように格納されているだけです。
もし、line[0][0] を printf しても、'j' が出力されるだけです。
line[0] を printf してやることによって "japan" が表示されるようになります。

>int read_line(FILE *);の中身で、これは、1行を読み込む関数ですか?
>それともこれで、数行を読み込めますか?
read_line 関数内の fgets で1行読込を行います。

>for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++)
>上記の条件だと思うのですが、NULLまでで終了になってますね。
>一行に、NULLというのが含まれていますよね、ということは、1行まで
>しか読めないきがするのですが・・・間違ってますか?
NULL はファイルの終端でしょう。1行の終わりと関係なさげです。



この投稿にコメントする

削除パスワード

No.22945

Re:配列のアクセス方法
投稿者---TT414(2005/09/02 16:05:10)


>一行に、NULLというのが含まれていますよね
一行に、NULLはありません。
一行の終わりはナル文字です。
NULLとナル文字は別物です。


この投稿にコメントする

削除パスワード

No.22947

ありがとうございました
投稿者---CENTER(2005/09/02 22:37:08)


お忙しい中、お答えいただきありがとうございました。

解決しました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧