🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #507

Re: [Q]区切りなしデータを文字型でない配列に読むには?

#507
From: Masao Seki
Date: Fri, 20 Mar 1998 00:00
73 lines
2791 bytes
Tomoaki Chiba wrote:

> 「可能な限り簡潔に」とは、ソースコードとしても短く、かつ、オンライン
> マニュアルを読めて「はじ゚てのC」(技術評論社)程度にC言語の知識を
> 持ち合わせている(C++はほとんどわからない)人が、ソースプログラム
> を読んで多くてもせいぜい10回程度(そのプログラムを)読み返すだけで理
> 解できるレベルと考えて下さい。

以下のようにするのは、どんなものでしょう。5、6回読めば、肝の部分は
理解できると思いますが。

文字列長さに半端があった時、先頭データで吸収するのか最後でするのか、
仕様がなかったので、楽な先頭の方にしました。
fgetsで文字列データをとりこんだ時、改行コードも取り込まれるシステム
を想定しています。エラー処理その他の、御質問の趣旨からはずれると思わ
れる部分は、かなり手抜きしています。

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

#define	MAXLENG	500
#define	MAXLINE	100
#define WID	5

int main(int ac, int **av)
{
	int m, n, n9, jverb = 0;
	int ndata[MAXLINE][MAXLENG/WID];
	unsigned char cbuf[MAXLENG+1], *p, save;
	size_t len;
	FILE *fp = stdin;

	if (ac > 1) jverb = 1;
	cbuf[MAXLENG] = '\0';
	for (m=0; m < MAXLINE; m++) {
		if (fgets(cbuf, MAXLENG, fp) == NULL || feof(fp)) break;
		else {
			len = strlen(cbuf) - 1;
			if (cbuf[len] != '\n') {
			  cbuf[10] = '\0';
			  fprintf(stderr, "too long line. %d: |%s ・・・ %s|\n",
				m, cbuf, cbuf+MAXLENG-10);
			  return 1;
			}
		}
		for (; isspace(cbuf[len-1]); len--) ;
		n9 = (len + WID -1)/WID;
		p = cbuf + ((len-1) % WID) + 1; 
		save = *p; *p = '\0';
		ndata[m][0] = atoi(cbuf); *p = save;
		for (n=1; n < n9; n++, p += WID) {
			save = p[WID]; p[WID] = '\0';
			ndata[m][n] = atoi(p);
			p[WID] = save;
		}
		if (jverb) {
			fprintf(stdout, "%3d: ", m);
			for (n=0; n < 5; n++)
				fprintf(stdout, "%*d ", WID, ndata[m][n]);
			fprintf(stdout, "・・・ ");
			for (n=n9-5; n < n9; n++)
				fprintf(stdout, "%*d ", WID, ndata[m][n]);
			fprintf(stdout, "\n");
		}
	}
	return 0;
}

-- 
関 正生 <masao.seki@fujixerox.co.jp || ma-seki@gb3.so-net.or.jp>
Technical Details
Message-ID: <35120784.56D9@rim.crl.fujixerox.co.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6esjd9$4t@sakunami.gw.tohoku.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 106434,8756f6f59b5f78c5
X-Google-Attributes: gid106434,public
From: Masao Seki <seki@rim.crl.fujixerox.co.jp>
Subject: Re: [Q]区切りなしデータを文字型でない配列に読むには?
Date: 1998/03/20
Message-ID: <35120784.56D9@rim.crl.fujixerox.co.jp>
X-Deja-AN: 335852243
Content-Transfer-Encoding: 7bit
References: <6esjd9$4t@sakunami.gw.tohoku.ac.jp>
Mime-Version: 1.0
Reply-To: masao.seki@fujixerox.co.jp
Content-Type: text/plain; charset=iso-2022-jp
Organization: Fuji Xerox
Newsgroups: fj.lang.c