カレントディレクトリ内の検索

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天和

カレントディレクトリ内の検索

#1

投稿記事 by 天和 » 15年前

カレントディレクトリ内の一つの.cファイルを選びそしてその次に検索したい言葉を入力しその言葉がある
行の行数とその行の文章を出力するプログラムを作りたいのですが。
例)homework.cファイルに
#include<stdio.h>
int main(void)
{
printf("hello work");
return 0;
}
とあって
filename?(これはprintf関数で書かれた質問)
homework.c
検索したい言葉は?(同上)
printf
と入力すると
4:printf("hello work");
と出れば正解です
そして自分が作ったソースコードは
#include<stdio.h>
int main(void)
{
int ch;
FILE *fp;
char fname[99]; /*検索したいファイル名*/
char word[99]; /*検索したい文字列*/
int i, j, n, s, count;

i = 1;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が何文字あっているか?*/
s = 0;/*検索したい文字列の文字数*/
count = 0;
printf("FILEname?\n");
scanf("%s", fname);
printf("検索したい文字は?");
scanf("%s", word);
while(1){    /*検索したい文字列は何文字か判定する*/
if(word[j] == '\0')/*ヌル文字があったら測定終了*/
break;
s++;
j++;
}
j = 0;/*また1文字目からやり直すためにいったんリセット*/

if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
printf("ERROR");
else{
printf("%d:",i);/*最初の行数*/
i++;

while((ch = fgetc(fp)) != EOF){
if(count == 0){/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
j = 0;
n = 0;
}
if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
{
n++;/*同じ文字かの正解数を1つあげる*/
count++;/*現在の文字が正解か否かの判定*/
j++;/*検索したい次の文字にチャレンジする*/
}
else{
count = 0;/*不合格なので検索したい最初の文字からやり直し*/
}
if(ch == '\n'){/*もし改行なら行番号をあげなさい*/
i++;
}
if(s == n){/*もし検索したい文字数と正解数が一緒ならその行を出力しなさい*/
printf("%d:", i);
fputs(ch);
j = 0;
n = 0;
}
}
fclose(fp);
}
return 0;
}
とかいたのですがエラーが出て動きません
エラー内容
fopen.c:7: error: stray ‘\227’ in program
fopen.c:7: error: stray ‘\128’ in program
fopen.c:7: error: stray ‘\128’ in program
fopen.c:52: warning: passing argument 1 of ‘fputs’ makes pointer from integer without a cast
fopen.c:52: error: too few arguments to function ‘fputs’
まずはこのエラーのとりかたを教えてくださいお願いします。
ちなみにいまじぶんが使っているコンパイラはGCCで
技術レベルはfopen関数が使えるぐらいです 画像

MNS

Re:カレントディレクトリ内の検索

#2

投稿記事 by MNS » 15年前

>fopen.c:7: error: stray ‘\227’ in program
>fopen.c:7: error: stray ‘\128’ in program
>fopen.c:7: error: stray ‘\128’ in program
このエラーは、おそらく7行目に全角スペースがあるために発生しています。

>fopen.c:52: warning: passing argument 1 of ‘fputs’ makes pointer from integer without a cast
>fopen.c:52: error: too few arguments to function ‘fputs’
fputsの書式は、

int fputs(const char *s, FILE *fp);

ですが、提示されたコードでは、

fputs(ch);

と記載されています。

第一に、引数の数が足りません。
第二に、chはint型なので、型が合いません。

よって、そのようなエラーが発生しています。

天和

Re:カレントディレクトリ内の検索

#3

投稿記事 by 天和 » 15年前

>MNSさん
#include<stdio.h>
int main(void)
{
const char ch;
FILE *fp;
char fname[99]; /*検索したいファイル名*/
char word[99]; /*検索したい文字列*/
int i, j, n, s, count;

i = 1;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が何文字あっているか?*/
s = 0;/*検索したい文字列の文字数*/
count = 0;
printf("FILEname?\n");
scanf("%s", fname);
printf("検索したい文字は?");
scanf("%s", word);
while(1){    /*検索したい文字列は何文字か判定する*/
if(word[j] == '\0')/*ヌル文字があったら測定終了*/
break;
s++;
j++;
}
j = 0;/*また1文字目からやり直すためにいったんリセット*/

if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
printf("ERROR");
else{
printf("%d:",i);/*最初の行数*/
i++;

while((ch = fgetc(fp)) != EOF){
if(count == 0){/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
j = 0;
n = 0;
}
if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
{
n++;/*同じ文字かの正解数を1つあげる*/
count++;/*現在の文字が正解か否かの判定*/
j++;/*検索したい次の文字にチャレンジする*/
}
else{
count = 0;/*不合格なので検索したい最初の文字からやり直し*/
}
if(ch == '\n'){/*もし改行なら行番号をあげなさい*/
i++;
}
if(s == n){/*もし検索したい文字数と正解数が一緒ならその行を出力しなさい*/
printf("%d:", i);
fputs(ch , fp);
j = 0;
n = 0;
}
}
fclose(fp);
}
return 0;
}
と変えましたがやっぱりエラーがでます。
fopen.c:7: error: stray ‘\227’ in program
fopen.c:7: error: stray ‘\128’ in program
fopen.c:7: error: stray ‘\128’ in program
fopen.c:33: error: assignment of read-only variable 'ch'(この変数は読み取り専用ですといっている?)
fopen.c:52: warning: passing argument 1 of ‘fputs’ makes pointer from integer without a cast

天和

Re:カレントディレクトリ内の検索

#4

投稿記事 by 天和 » 15年前

すいません
const char ch;を
char ch;
に変えたらfopen.c:33: error: assignment of read-only variable 'ch'(この変数は読み取り専用ですといっている?)
が消えました

MNS

Re:カレントディレクトリ内の検索

#5

投稿記事 by MNS » 15年前

>fopen.c:7: error: stray ‘\227’ in program
>fopen.c:7: error: stray ‘\128’ in program
>fopen.c:7: error: stray ‘\128’ in program

もう一度良いますが、7行目の全角スペースを消してください。

char word[99]; /*検索したい文字列*/
    ↓
char word[99]; /*検索したい文字列*/


char ch で正しいとは思いますが、
そもそものところ、fputsで表示したいのは、該当語句が含まれる行ですよね?
chはあくまで検索に用いる'一文字'だと思うのですが。

天和

Re:カレントディレクトリ内の検索

#6

投稿記事 by 天和 » 15年前

>MNSさん
>もう一度良いますが、7行目の全角スペースを消してください。
てっきりcharとwordの間のほうかと思ってましたorz
>char ch で正しいとは思いますが、
そもそものところ、fputsで表示したいのは、該当語句が含まれる行ですよね?
chはあくまで検索に用いる'一文字'だと思うのですが。

やっぱり1文字ずつ調べるfgetcと1行表示させるfputsじゃあだめですか・・・・
でも1行の部分的なことを探るなんてできませんし・・・・

MNS

Re:カレントディレクトリ内の検索

#7

投稿記事 by MNS » 15年前

ちょっと、複雑になるかもしれませんが、行を記録していけば問題ありません。
まず、行を記録する文字列と、行の文字数を表すカウンタを用意します。
また、その行を出力するか否かの、フラグも用意しておくことにします。


char word[99];/*検索したい文字列*/
char string[1024]; /*行を記録*/
int count2 = 0; /*行の文字数*/
int Flag = 0; /*行を表示するか(0=しない, 1=する)*/



そして、一文字ごとに記録していきます。


while((ch = fgetc(fp)) != EOF){
string[count2] = ch;
count2++;



こんな感じにです。
次に、フラグを立てる処理を加えます。


if(s == n){/*もし検索したい文字数と正解数が一緒ならその行を出力しなさい*/
printf("%d:", i);
Flag = 1;
j = 0;
n = 0;
}


最後に、行を表示する処理を加えます。
(count3という変数を、用意しておいてください。forループに使います)


if(ch == '\n'){/*もし改行なら行番号をあげなさい*/
i++;
string[count2] = '\0';
if(Flag == 1)
{
count3 = 0; /*forループに使用*/
for(; count3 < count2+1; ++count3)
{
printf("%c", string[count3]);
}
}
count2 = 0;
Flag = 0;

}


ご自分で、場所を探して入れてみてください。
適当なところに入れれば、多分動くと思います。

天和

Re:カレントディレクトリ内の検索

#8

投稿記事 by 天和 » 15年前

おおーできましたーありがとうございます!
おかげで解決しました・・・・といいたいんですが実はもうひとつ課題があるのですが(これの上位版のような)
引き続きここで書いてもよろしいでしょうか?
それとも新規投稿するべきですか?
よろしくお願いします。

MNS

Re:カレントディレクトリ内の検索

#9

投稿記事 by MNS » 15年前

この課題と密接に関係する話題であれば、ここで質問すべきですが、
上位版と言えど、この課題と関係がない(この課題をしらなくても問題がない)のであれば、
別にどちらでも良いと思いますし、厳密な決まりもないと思います。

ただ、記事数の多いスレッドは、最初からそのスレッドを読んでいない回答者さんからは敬遠されやすいかもしれませんので、
さきのようなことがなければ、新たにスレッドを立てたほうが良いのではないか、と個人的には思います。

追記:
コードはきちんとインデントを使いましょう。
ひどく見にくいと思う回答者さんもいるかもしれませんから。
画像

天和

Re:カレントディレクトリ内の検索

#10

投稿記事 by 天和 » 15年前

わかりました念のため新規投稿します

閉鎖

“C言語何でも質問掲示板” へ戻る