LoginSignup
1
0

More than 3 years have passed since last update.

'cl'与えられた数値から、辞書中の単語を返すコード。

Last updated at Posted at 2019-01-23

cl emits english word(s) for a given number from dictionary file.

for terminal.

与えられた数値に対応する英単語または英熟語または英文の集合を返すプログラム。 lcと逆の動作をします。

アルファベットのAからZまでを1から26まで(小文字のaからzまでも同様に1から26)の数値に対応させ、語の文字列のアルファベットを順に加算していった結果が、その語の値となります。

標準入出力に対応しています。C言語で書かれています。

この'cl'のdebパッケージは、僕のGitHubリポジトリ、「extwords」の、
ewordsというパッケージに依存します。

Usage: cl [-d=dicfile] <Number>
usage ex.1: cl 76
usage ex.2: echo 76 | cl

Compile: cl.c -o cl

See:
【GitHub/バイナリ】
https://github.com/fygar256/cl
【Qiita】(辞書ファイルについて)
https://qiita.com/fygar256/items/7b4f090489eb1563238c

CODE

cl.c
/*
与えられた数値に対応する英単語を見つける
    Usage: cl [-d=dicfile] <Number>
    usage ex. 1: cl 76
       usage ex. 2: echo 76 | cl

    to compile: cl.c -o cl
*/
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <ctype.h>

char defaultdic[]="/usr/share/dic/ejdic-hand-utf8-words.txt";
FILE *fp,*so;

void wayout() {
    fclose(so);
    fclose(fp);
    system("sort ol.tmp |uniq && rm ol.tmp");
    exit(0);
}

int ffgetc(FILE *fp) {
    int c;
    c=fgetc(fp);
    if (c==EOF) wayout();
    return(c);
}

char *getword(FILE *fp) {
    int idx;
    int c;
static  char word[1024];

    idx=0;
    c=ffgetc(fp);
    if (c==0x81) ffgetc(fp);
        else ungetc(c,fp);

    while(1) {
        c=ffgetc(fp);

        if (c==' ') {
            int c2;
            c2=ffgetc(fp);
            if (c2==' ') c='\n';
            else ungetc(c2,fp);
            }
        if (c=='(') {
            while(1) {
                c=ffgetc(fp);
                if (c=='\n') break;
                if (c==')') continue;
                }
            }
        if ((!isalpha(c))&&(c!=' ')) break;
        word[idx]=(unsigned char)c;
        idx++;
        }
        word[idx]='\0';
        ungetc(c,fp);
        while(ffgetc(fp)!='\n');
        if (word[idx-1]==' ')
            word[idx-1]='\0';
        return(word);
}

int cwv(char *s) {
    int n=0;
    while(1) {
        if (*s=='\0') return(n);
        if (*s>='A' && *s<='Z')
                n+=*s-'A'+1;
        else if (*s>='a' && *s<='z')
                n+=*s-'a'+1;
        s++;
        }
    return(n);
}

int main(int argc,char *argv[])
{
    int n;
    int wv;
    char *word;
    char *dicfile=defaultdic;

    if (argc>=2&&strncmp(*(argv+1),"-d=",3)==0) {
            dicfile=&((*(++argv))[3]);
            argc--;
            }

    if (argc==1)
        fscanf((FILE *)stdin,"%d",&n);
    else if (argc==2)
        sscanf(*(++argv),"%d",&n);
  else {
      fprintf(stderr,"Usage : %s [-d=path/dicfile] number\n",argv[0]);
      exit(1);
      }

    if (n<=0) {
    fprintf(stderr,"Number Error\n");
    exit(1);
    }
    fp=fopen(dicfile,"r");
    so=fopen("ol.tmp","w");
    if ((fp==NULL)||(so==NULL)) {
    fprintf(stderr,"File Open Error.\n");
    exit(1);
    }
    while((word=getword(fp))!=NULL) {
        wv=cwv(word);
        if (wv==n)
            fprintf(so,"%s\n",word);
        }
    wayout();
}

出力例

$ cl 25
ABV
Aare
Abbado
Abbas
Acrab
Albee
Aleg
Alka
All
Area
Ax
BSD
Badr
Bagan
Bago
Baihe
Balia
Barca
Beale
Becej
Bend
Bima
Brad
Brda
Cabra
Calace
Calah
Cali
Cape
Cau
Chadha
Cigada
Cim
Cofa
Cua
DPE
Dahl
Danae
Daraa
Darb
Dedic
Dhaka
Diff
Egal
Eich
Erb
Fame
Foca
Fra
GR
Gabo
Gaddi
Gael
Gale
Gela
Gide
Goba
Habahe
Hagi
Haifa
Haig
Hel
Hidd
Hpa
IP
Ibn
Ike
Jack
Jakab
Jan
Jo
Kaffa
Kaid
Kam
Labia
Lage
Lal
Lega
Leh
Mach
Mecca
Meg
Mic
NK
Nef
Pace
Paga
Sea
Tabb
Tad
VC
Y
abele
ackee
acta
all
ambi
area
arf
ax
baddie
bard
beedi
behead
bend
bibl
bigg
bin
blk
boh
brad
bub
bw
cabbaged
caecal
cape
carba
cata
cham
clade
cog
cv
darb
dat
dead bed
decal
deek
deke
dep
diced
dil
dof
drab
edged
egal
et
fame
far
feck
fen
flg
gadid
gaffe
gale
gem
ghee
gr
hagi
hake
hap
hdbk
hob
iamb
ibadah
ibn
ike
jack
jo
kadi
kala
keed
kn
labia
laced
laff
laic
lid
mach
mecca
mic
ml
nef
nib
odea
pace
pah
ped
pha
pi
rcd
reb
sae
scab
sea
tad
te
vc
waa
y
$
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0