掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29420

間接参照レベルがことなってしますのですが・・・
投稿者---やま(2007/01/12 23:07:57)


テキストファイルから「たこやき」という文章を一文字ずつ読み込んで
そのなかの「た」と「こ」という文字を照らし合わせて「やき」だけを
表示するプログラムを作っているんですがWhile文ののところのプログラム
で間接参照のレベルが異なっているとでてしまい、いろいろしらべて見たのですがどうもうまくいかないのでどなたかご教授お願いします。

#include <stdio.h>
#include <stdlib.h> /* exit( ) で必要 */
#include <string.h>

void main(void);
void main(void)
{
FILE *fp;
char c[2][50],a[2][50];
int n=0;

strcpy( c[0], "た" );
strcpy( c[1], "こ" );

/* ファイルを開くのに失敗したら */
/* プログラムを終了して、シェルに戻る */
if ((fp = fopen( "test.txt", "r")) == NULL) {
fprintf(stderr, "Can't Open File\n");
exit(2);
}

/* ファイルの終わりに達するまで */
while ((a[n] = fgetc(fp)) != EOF){/* 一文字読み込み */
n++;
}
for(n=0;n < 2 ;n++){
if(c[n] != a[n])
printf("%s",a[n]);
}
fputc(c, stdout); /* 画面に表示 */
fclose(fp); /* ファイルを閉じる */
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:間接参照レベルがことなってしますのですが・・・ 29422 kolona 2007/01/13 03:07:26
<子記事> Re:間接参照レベルがことなってしますのですが・・・ 29423 あかま 2007/01/13 03:18:04


No.29422

Re:間接参照レベルがことなってしますのですが・・・
投稿者---kolona(2007/01/13 03:07:26)


>テキストファイルから「たこやき」という文章を一文字ずつ読み込んで
>そのなかの「た」と「こ」という文字を照らし合わせて「やき」だけを
>表示するプログラムを作っているんですがWhile文ののところのプログラム
>で間接参照のレベルが異なっているとでてしまい、いろいろしらべて見たのですがどうもうまくいかないのでどなたかご教授お願いします。

ソースの添付は「HTML変換ツール」で字下げします。
環境(OSとコンパイラ)や症状は具体的に詳しく書きます。

が守られていません。今回の問題は、環境標準の文字コードがわからないと説明できません。

何がやりたいのか、いまいちわかりません。
「たこ」を読み飛ばして、「やき」を表示するということですか?
それなら、
while ((a[n] = fgetc(fp)) != EOF){/* 一文字読み込み */
    n++;
}


ここは明らかにおかしいです。
fgetc()は返り値がint型なので、a[n][0]で受ける必要があります。
しかも、日本語なら最低2Byteは使うはず(文字コードがわからないと断言できません)なので、
1文字につきfgetc()は2回実行されなければなりません。

こういうのは
(1) 1行全部読み込む。
(2) 「たこ」の文字を探す
(3) 「たこ」の文字以降を表示する

の方が簡単だと思います。
あと、
char c[2][50];
は50Byteの文字列領域を2つ確保していますが、それでいいんですか?



この投稿にコメントする

削除パスワード

No.29423

Re:間接参照レベルがことなってしますのですが・・・
投稿者---あかま(2007/01/13 03:18:04)


テキストファイルには「たこやき」としか書かれてないのでしょうか?
それとも長い文章の途中にたこやきが出てくるのでしょうか?

プログラムを読んだかぎり複雑に考えすぎている感じがします。
役に立ちそうなことをいくつか書いておきます。

char c[2][50];
strcpy( c[0], "た" );
strcpy( c[1], "こ" );

は

char c[2][50]={"た","こ"};

で初期化できます。
でも

char c[50]={"たこ"};

として1つの文字列として扱ったほうがプログラムを組みやすいと思います。
そうすれば,

char a[50];
fgets(a,50,fp);//1行読み込み

strncmp(a,"たこ",4);//読み込んだ1行の先頭が"たこ"かどうか
strstr(a,"たこ");//読み込んだ1行の中に"たこ"があるか.

などの関数で調べられます。
>一文字ずつ読み込んで
という制約を無視していいのならですが。


あと本質ではないですが,

void main(void)

というのは実は間違っていて

int main(void)

が正しいです。どっちでも大抵動きますが。
main関数の関数宣言もたぶんいらないです。


字下げされてないけど,プログラムが悩みまくった跡がいっぱいで好印象です。
がんばって完成させてください。


strncmpの説明
http://www9.plala.or.jp/sgwr-t/lib/strncmp.html

strstrの説明
http://www9.plala.or.jp/sgwr-t/lib/strstr.html



この投稿にコメントする

削除パスワード

No.29427

Re:間接参照レベルがことなってしますのですが・・・
投稿者---やま(2007/01/13 16:23:52)


書き込みありがとうございました

ゆくゆくはこれを使って、形態素解析というか単語の抜き出しを
できるようなプログラムにしようと思っています。

参考にしてがんばってみます


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧