プロが教えるわが家の防犯対策術!

◎プログラム仕様

C言語を使用

入力ファイルから1レコードを入力する。改行マークまで入力する。
2番目の「:」以前のデータを有効とする。
2番目の「:」からは、不要です。
出力ファイルへ出力する。
この処理を最終レコードまで行う。

処理の例
yoneko:ksgtgsmbnisysbnka:sjkmakshs7s:sksksk99jjs: 入力データ
yoneko:ksgtgsmbnisysbnka                出力データ

入力ファイル名・出力ファイル名は、任意に指定できるものとする。
入力ファイルの1レコード当たりの最大バイト数は、100バイトします。
それぞれの処理でエラーが発生した場合は、エラーの表示を行う。


を依頼されました。
まったく意味が分りません。
わかりやすく説明していたでけないでしょうか。
C言語、自体わかりません。

A 回答 (7件)

みっともない英文を書いたので、そのお詫びがてら、コメントを。




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

int main()
{
  char buf[1024];  /* 大き目に読込バッファをとっておく */
  buf[101] = -99;  /* 超えてはいけないところに、ASCII文字以外のコードを埋めておく(番人) */

  while (gets(buf)) /* 標準入力から一行読み込んで EOF かエラーを返すまで */
  {
    char* p;
    if (buf[101] != -99) /* 番人として埋めたコードが置き換わっていたら、1レコードの制限を越えたと判断 */
    {
      fprintf(stderr, "input record maybe exceeds the limits (100 bytes).\n");
      exit(1);
    }

    if (p = strchr(buf, ':'))  /* 最初に出てくる ':' の位置を p に入れる */
    {
      p = strchr(p + 1, ':'); /* 最初の ':' の次の位置から ':' を(つまり二個目)探す */
      if (p)      /* 二個目の ':' があれば */
        *p = '\0';  /* そこを文字列の終端にする */
      /* 二個目の ':' が無ければ、入力レコードはそのまま */
    }
    /* 一個目の ':' が無ければ、入力レコードはそのまま */

    puts(buf);       /* 二個目の ':' 以降をちょん切った文字列を標準出力に書き込み */
    if (ferror(stdout))  /* 一応、書き込みエラーのチェック */
    {
      fprintf(stderr, "write error\n");
      exit(1);
    }
  }
  if (ferror(stdin))  /* 一応、gets() のエラーチェック */
  {
    fprintf(stderr, "read error\n");
    exit(1);
  }
  return 0;
}

後、マニュアルを読めば分かることですが、strchr() は、一つ目の引数で
示される位置から、二つ目の引数で示される文字を探す関数です。
もし、文字が見つかればその位置を、見つからなければ NULL を返します。

省略した書き方をしていますが、

  if (p = strchr(buf, ':'))

は、

  if ((p = strchr(buf, ':')) != NULL)

もっと(他の言語を知っているとして)わかりやすく書けば

  char* pos;
  pos = p = strchr(buf, ':');
  if (pos != NULL)

です。


後、いんちき英語についても弁解をしておこう。

「日本語の方がわかりやすい」ということについては、ametsuchi さんの
いう通り。

ただ、いんちきでも良いから、なるべく英語を近くにおいておく習慣を
つけておいた方が良いです。

日本語が表示できない環境はほとんど無いと言っても良いが、日本語を
入力できない環境はままあったりするし、なにしろ最新の情報は、まず
英語圏から発信されることが多い。

また、日本語のマニュアルの意味が良く分からないなあ、と思ったら、
テクニカルタームを良く知らない人が和訳をしているだけで、英語の
マニュアルでは意味が一目瞭然だったり。


なるべく書くようにしておけば、間違っていても、指摘をしてくれる人も
居るわけで (^^;
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
標準入出力とリダイレクトについて勉強中です。

お礼日時:2001/03/29 17:01

a-kumaさんの回答素晴らしいのだけれど、英文のメッセージおかしくないですか?



私の英語力もメチャひどいのだけれど...

1)Excess:名詞です。ここに名詞がくるのはおかしいのでは?動詞であるExceeds(3人称単数、現在)、またはExceed?因みに昔読んだ米国人の書いたソースコード(=Fortran)では「Exceeds the limit」というような表現だったと思う。

2)byte--->bytes?(複数形)

私もFortran時代は、無理してインチキ英語でコメントやらメッセージを書いていたが、最近は日本語。日本人が読むのであればそれが一番です。書く方も楽。

madaraさんにも、それをオススメします。
    • good
    • 0

「答えて」系のサイトに書き込むのだから、他の方のように


質問者の背景や質問の理由は敢えて問いません。

素直じゃないところが何ヶ所かあるので、学校の課題だと
突っ込まれるところがあるかも。せめて、マニュアル程度を
引いて、意味を調べておくことをすすめます。

もし、仕事なら、それが研修の課題であろうと、実務であろ
うと、意味が分かってないと、将来苦労するでしょうから
やっぱり、少しは調べておいた方が良いでしょうね。



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

int main()
{
  char buf[1024];
  buf[101] = -99;
  while (gets(buf))
  {
    char* p;
    if (buf[101] != -99)
    {
      fprintf(stderr, "input record maybe excess 100 byte.\n");
      exit(1);
    }
    if (p = strchr(buf, ':'))
    {
      p = strchr(p + 1, ':');
      if (p)
        *p = '\0';
    }
    puts(buf);
    if (ferror(stdout))
    {
      fprintf(stderr, "write error\n");
      exit(1);
    }
  }
  if (ferror(stdin))
  {
    fprintf(stderr, "read error\n");
    exit(1);
  }
  return 0;
}


ファイルの指定は、標準入出力を使っているので、リダイレクト
で指定してね。


# 「わかりやすく説明」という意味では、落第点の回答ですね
    • good
    • 0
この回答へのお礼

回答してくださってありがとうございます。
このプログラムがどういう意味なのかが分らないので
a-kumaさんのすばらしさがわからないのが残念です。
ただいま少しずつ勉強中です。

お礼日時:2001/03/21 09:47

皆さんも言っておられるとおり仕事で来ているなら変ですね。

断るしかないでしょう。

実際のところ、学校の課題かなにかように見えるのですが・・・
答え自体は簡単ですが、勉強している人ならなおの事、お答えしかねます。(つめたいようですが・・・)
    • good
    • 0

こんにちは。


依頼された・・ということは、お仕事なのですか?

C言語が解らなくて、このプログラム仕様がまったく意味がわからないのであれば、
無理でしょう。
説明しても、理解はできないのではないでしょうか?
もし、ここでコーディング例を書いて、それでお仕事をこなしたとしても、
お仕事であればメンテナンスも発生してくるでしょうし。。
理解できていないとメンテもできませんよね?

どういう経緯で依頼がきたのか解りませんが・・。

他の言語でプログラミングはできますか?
それともプログラミング自体がわからない??
madaraさんの知識の範囲がわかりませんので、なんとも・・・。
    • good
    • 0

C言語がわからないと、さっぱりだと思いますよ。


多分、基礎知識がないとどんな説明をしても
出来ないと思います。
何故こんな仕事が来たのかも疑問ですし。
これはもともとプログラマがするようなことですし。
(それほど難しくないけど)

ファイル入出力があるので、
ド素人では不可能です。
    • good
    • 0

C言語がまったくわからない人に、何故こういう依頼が来たのでしょうか?


まずはここが疑問です。仕事ならなおさらです。

これくらいのプログラムなら、わかる人には30分もあれば作れると
思うのですが、これが仕事ならお金をもらわないと割りが合いません。

C言語をまったくわからない人に、わかりやすく説明するのは難しいと思います。
ちなみにどういう言語はOKなんですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!