「Cでプログラミングするには人生は短すぎる」か?

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2011/02/01(火) 00:02:54
Monoプロジェクトの公式発表ではないが、その主導者であるミゲル・デ・イカザ氏の言葉として、
「Cでプログラミングするには人生は短すぎる」という標語が掲げられている。
http://bit.ly/fJCXb0
2011/02/16(水) 18:20:18
>>163 クソコードだけど。
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

#define BUFSIZE 1024
#define NUMBER_OF_BRANKETS 10 /* 0の方が高速 */

/*
*dst : 置換後の文字列を書き込む領域確保済みのバッファ
*src : 置換前の文字列
*st_string : 置き換える文字列
re : コンパイル済み正規表現
*/
int replace(unsigned char *dst,
const unsigned char *src, unsigned char *st_string, regex_t re);


main()
{
regex_t re; /* 正規表現コンパイル結果を格納する構造体 */
unsigned char *re_string = "[0-9]+"; /* 正規表現 */
unsigned char *st_string = "[number]"; /* 置換後の文字列 */
unsigned char *dst, *src, *emsg;
unsigned int ecode; /* エラーコード */

/* 正規表現をコンパイルする */
if(0 < (ecode = regcomp(&re, re_string, REG_EXTENDED))){
// コンパイル失敗時はエラーメッセージを出して終了
emsg = malloc(BUFSIZE);
regerror(ecode, &re, emsg, BUFSIZE);
fprintf(stderr, "%s\n", emsg);
2011/02/16(水) 18:21:03
fprintf(stderr, "%s\n", emsg);
free(emsg);
exit(-1);
}

/* メモリーを取得 */
src = malloc(BUFSIZE);
dst = malloc(BUFSIZE);

while(!feof(stdin)){
/* 標準入力から1行入力 */
if(NULL==fgets(src, BUFSIZE, stdin))
continue;
/* 置換を実行 */
replace(dst, src, st_string, re);
/* 置換した文字列を標準出力へ出力 */
printf("%s", dst);
}

/* メモリーを開放 */
free(src);
free(dst);

/* 構造体を開放 */
regfree(&re);

return 0;
}
2011/02/16(水) 18:21:46
int replace(unsigned char *dst,
const unsigned char *src, unsigned char *st_string, regex_t re)
{
unsigned char *p, *q;
unsigned int i; /* 入力文字列のための添字 */
regmatch_t *pmatch = NULL; /* 一致データの格納先 */
unsigned int ecode; /* エラーコード */

pmatch = calloc(NUMBER_OF_BRANKETS + 1, sizeof(regmatch_t));

/* パターン・マッチング */
if(REG_NOMATCH == (ecode = regexec(&re, src, NUMBER_OF_BRANKETS + 1, pmatch, 0))){
pmatch[0].rm_so = -1;
}
/* 置換処理用のポインターをセット */
q = dst; i=0;
/* コピーと置換処理 */
while('\0' != src[i]){
/* 正規表現とマッチする位置に来たときの処理 */
/* pmatch[0]が一致文字列全体、pmatch[1]以降が括弧内の部分一致部分の情報 */

if(i == pmatch[0].rm_so){
/* q - dst < BUFSIZE - 2 はバッファー・オーバーフロー対策 */
for(p = st_string; '\0'!=*p && q - dst < BUFSIZE - 2; p++){
*q++ = *p;
}
/* 入力文字列の文字位置を表す添字に加算 */
i += pmatch[0].rm_eo - pmatch[0].rm_so;
/* 再帰でグローバル・マッチングにする */
q += replace(q, src + i, st_string, re);
/* 再帰先で処理が終了しているのでループを抜ける */
break;
2011/02/16(水) 18:22:30
} else if(q - dst < BUFSIZE - 2){
/* 1文字コピー */
*q++ = src[i++];
}
}
/* NULL文字をつけ足す */
*q = '\0';

free(pmatch);

/* 置換後の文字数を戻す */
return q - dst;
}

http://uncorrelated.no-ip.com/20101023.shtml からコピペ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況