Lying Devils

日々いろんなことを呟いていく。そんな感じ?

【C言語】疑問ができたのでとりあえず上げる【解決済み】

 

 前略

 学校の課題で自然言語処理をCでやれって言われたのでやってみる事にしました。というか期間がもう間近に迫っていて結構しんどいんですよね。

 自然言語処理をする上で必要な情報に、出てくる文字の数というのがあると思います。例えばAが何回出ました、Bが何回出ました、といったものですね。

 なのでそれをとりあえず計算する必要があるので、そういった感じの処理を描こうとしたわけです。

  まずはstrをアスキーコード分、つまり128定義して初期化した後、以下の様な感じで1ずつ足していくといいかなと思った訳です。

 

28while( (ch = fgetc(fp) ) != EOF){
29 if(isalpha(ch) != 0 || isblank(ch) != 0 || ch == '\n'){
30
31    fputc(ch,sf);
32    if(i < 10){
33        str[ch]++;
34        i++;
35        printf("%c = %d\n",ch,str[ch]);
36    }
37 }else{
38
39 fputc(' ',sf);
40
41 }
42 }

 

  これならB = 2みたいな感じで出てくるのかなーと思ったんですけど

 

h = 1
e = 1
r = 15775232
l = 10
o = 32688
c = 32688
k = 1
= -204839807
H = 1
o = 32689

  結果的にこうなったんですよね。

 なんだこの値!?しかも律義に加算処理はされてるし……

 

 

 値が変なのは'r','l','o','c',' 'の値、具体的には114,108,111,99です。

 まだl移行が全ておかしいとかならばまだ色々考えられたのですが、cまでおかしいとなるとちょっと理解が及びません。

 ちなみに、str[246]にした場合には不具合がなくなってました。なんでや(困惑)

 

h = 1
e = 1
r = 1
l = 1
o = 1
c = 1
k = 1
= 1
H = 1
o = 2

 

  割とマジで理解が及んでないので誰か教えてくれねえかなあ見たいなのをかねてブログに纏めました。

 本当はこのくだりを何かしらそのような質問サイトに送るのが一番なんだとは思うんですけど、ぶっちゃけ面倒なのでここで済ませました。

 切羽詰まったら出そうかなとかは思ってるいや限界だ今出すねッ!

 

 少なくともchへの値の導入にミスってる様子はないので、多分配列エラーなんだろうなとは思います。初期化が上手くいっていないか、そう思って初期化の文をもう一度出力する文章もつけました。

 

13
14 fp = fopen("test.txt", "r");
15 if( ( fp == NULL) ){ 16 printf("test.txt FILE OPEN ERROR");
17 return -1;
18 }
19
20 sf = fopen("output.txt","w");
21 if(sf == NULL){
22 printf("output.txt FILE OPEN ERROR");
23 return -1;
24 }
25
26 27 for(i; i < 128; i++){
28 str[i] = 0;
29 }
30 for(i; i < 128; i++){
31 printf("str[%d] ... %d\n",i,str[i]);
32 }
33
34 i = 0;
35 while( (ch = fgetc(fp) ) != EOF){

:~/programs/works$ gcc litr.c -o litr
:~/programs/works$ ./litr
104 ... h = 1
101 ... e = 1
114 ... r = 15775232
108 ... l = 10
111 ... o = 32621
99 ... c = 32621
107 ... k = 1
32 ... = -1039616911
72 ... H = 1
111 ... o = 32622

 

 

どういうことなの……

 

 


 

 

 現場からは以上です

 ではノシ

 

 

 追記:ちょっとまって?なんでプログラムの一部が変な風になってるの?HTML画面見てもそれっぽい記述ないよ?なにしてくれてんの??

 追記2:プログラムははてな記法で書いた方がソースコードの色付けができるのを知ったので今後はそうする事にしますっていうかそうじゃねえなんで勝手にリンクが貼られてんのかをきいてんだおれはよおおおおお

 追記3:(重ねたらだめなの!?ふざけんな*1

 追記4:泣きの追記です。というか、すごく初歩的なミスだったことが判りました。

 ここの部分なんですけど、普通にi = 0ってするの忘れてますね、ええ。多分、したつもりだったんでしょうね。だからだと思いました。というか、そうでした。

:~/programs/works$ gcc litr.c -o litr
:~/programs/works$ ./litr
str[0] ... 0
str[1] ... 0
str[2] ... 0
str[3] ... 0
str[4] ... 0
str[5] ... 0
str[6] ... 0
str[7] ... 0
str[8] ... 0
str[9] ... 0
str[10] ... 0
str[11] ... 0
str[12] ... 0
str[13] ... 0
str[14] ... 0
str[15] ... 0
str[16] ... 0
str[17] ... 0
str[18] ... 0
str[19] ... 0
str[20] ... 0
str[21] ... 0
str[22] ... 0
str[23] ... 0
str[24] ... 0
str[25] ... 0
str[26] ... 0
str[27] ... 0
str[28] ... 0
str[29] ... 0
str[30] ... 0
str[31] ... 0
str[32] ... 0
str[33] ... 0
str[34] ... 0
str[35] ... 0
str[36] ... 0
str[37] ... 0
str[38] ... 0
str[39] ... 0
str[40] ... 0
str[41] ... 0
str[42] ... 0
str[43] ... 0
str[44] ... 0
str[45] ... 0
str[46] ... 0
str[47] ... 0
str[48] ... 0
str[49] ... 0
str[50] ... 0
str[51] ... 0
str[52] ... 0
str[53] ... 0
str[54] ... 0
str[55] ... 0
str[56] ... 0
str[57] ... 0
str[58] ... 0
str[59] ... 0
str[60] ... 0
str[61] ... 0
str[62] ... 0
str[63] ... 0
str[64] ... 0
str[65] ... 0
str[66] ... 0
str[67] ... 0
str[68] ... 0
str[69] ... 0
str[70] ... 0
str[71] ... 0
str[72] ... 0
str[73] ... 0
str[74] ... 0
str[75] ... 0
str[76] ... 0
str[77] ... 0
str[78] ... 0
str[79] ... 0
str[80] ... 0
str[81] ... 0
str[82] ... 0
str[83] ... 0
str[84] ... 0
str[85] ... 0
str[86] ... 0
str[87] ... 0
str[88] ... 0
str[89] ... 0
str[90] ... 0
str[91] ... 0
str[92] ... 0
str[93] ... 0
str[94] ... 0
str[95] ... 0
str[96] ... 0
str[97] ... 0
str[98] ... 0
str[99] ... 0
str[100] ... 0
str[101] ... 0
str[102] ... 0
str[103] ... 0
str[104] ... 0
str[105] ... 0
str[106] ... 0
str[107] ... 0
str[108] ... 0
str[109] ... 0
str[110] ... 0
str[111] ... 0
str[112] ... 0
str[113] ... 0
str[114] ... 0
str[115] ... 0
str[116] ... 0
str[117] ... 0
str[118] ... 0
str[119] ... 0
str[120] ... 0
str[121] ... 0
str[122] ... 0
str[123] ... 0
str[124] ... 0
str[125] ... 0
str[126] ... 0
str[127] ... 0
104 ... h = 1
101 ... e = 1
114 ... r = 1
108 ... l = 1
111 ... o = 1
99 ... c = 1
107 ... k = 1
32 ... = 1
72 ... H = 1
111 ... o = 2

 

 俺のキレ芸に何の意味があったんだろうか。

 涙が出ちゃう。女の子だもん

 というわけで解決です。

 みなさんも変数を定義するときはちゃんと()内でやろうな!

 あとプログラムをはてなブログに貼るときは編集ははてな記法かMa…Mなんとかを使うといいと思うお!

*1:半ギレ