【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.18869

文字列の検索
投稿者---れいな(2004/12/24 09:48:46)


標準入力された文字列を標準入力されたテキストまたはすでに存在するファイルから検索するプログラムをつくっています。
コンパイルはできるのですが、うまく文字列が検査されず困っています。教えていただけますか?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define LINE_SIZE 1000
#define DATA_SIZE 100

int main(void){
  FILE *st;                     /* ファイルポインタ*/
  char buf[LINE_SIZE];    /*検索対象の文章をうけとる*/
  char filename[DATA_SIZE]; /*検索対象のファイル名をうけとる*/
  char key[20];              /*検索する文字列をうけとる*/
  char op[3];              /*操作選択に使用*/
  char *p;
  int i,b_len,k_len;
  int linenum=0;         /*行数をぞえるための変数*/
  int count=0;

  p=buf;
  b_len = strlen(buf);
  k_len = strlen(key);
      
 
  while(1){
    printf("検索する文字列を入力してください:");
    fgets(key,20,stdin);
    
    printf("q) 最初に戻る\n");
    printf("1) 入力した文章から検索\n");
    printf("2) ファイルから検索\n");
    printf("操作を選択してください: ");
    fgets(op, 3, stdin);
    
    if(strchr(op, L'q') != NULL){
      break;
    }
    else if(strchr(op, L'1') != NULL){
      
      printf("検索対象の文章を入力してください:");
      fgets(buf,LINE_SIZE,stdin);
      
      
      while (1){
    p = strstr(p,key);   /*pの位置から検索開始*/
    if (p==NULL) 
      break;/*NULLなら検索終了*/
    
      count++;
      p= p+k_len;/*次の検索のためにポインタをずらす*/
      }
     printf("%d回\n",count);
      }
      return 0;
    }
    else if (strchr(op, L'2') != NULL){
      printf("検索対象のファイル名を入力してください:");
      fgets(filename, DATA_SIZE, stdin);
      filename[strlen(filename)-1]='\0';          //改行文字をヌル文字に置換   
      
      /*ファイルのオープン*/
      st = fopen(filename,"r");
      if(st==NULL){
        perror("fopen");
        exit(EXIT_FAILURE);
      }
      /*オープンしたファイルへの操作*/
      while(fgets(buf,LINE_SIZE,st) != NULL){            //1行ずつ読み出す
        linenum++;            
        p = strstr(p,key);   /*pの位置から検索開始*/
    if (p==NULL) 
      break;/*NULLなら次の行*/

        count++;
        printf("%d回目--%d行目 %s\n",count,linenum,buf);
        p =p+k_len;/*次の検索のためにポインタをずらす*/
      }
      
      if(ferror(st)!=0){
        perror("fgetws");
        exit(EXIT_FAILURE);
      }
      /*ファイルのクローズ*/
      if(fclose(st)!=0){
        perror("fclose");
        exit(EXIT_FAILURE);
      }
      
      exit(EXIT_SUCCESS);
      
    }else{
      printf("入力しなおして下さい。\n");
    }
  }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の検索 18870 れいな 2004/12/24 10:01:53


No.18870

Re:文字列の検索
投稿者---れいな(2004/12/24 10:01:53)


開発環境を書いていないのに気づきました。
unixを使っているんですが・・・すいません・・・
学校のPCにログインしているのでよくわからなくて。


この投稿にコメントする

削除パスワード

No.18871

Re:文字列の検索
投稿者---もぐりん(2004/12/24 12:00:18)


本当にコンパイルしましたか?

Cygwinのgccでコンパイルしましたが、
------------------------------------
$ gcc -o demo002 demo002.c
demo002.c: In function `main':
demo002.c:55: error: parse error before "else"
demo002.c: At top level:
demo002.c:90: error: parse error before "else"
------------------------------------
とエラーメッセージが表示されてコンパイルできませんでした。
多分、括弧の数が合っていないためだと思います。
コンパイルできたソースを提示してください。




>開発環境を書いていないのに気づきました。
>unixを使っているんですが・・・すいません・・・
>学校のPCにログインしているのでよくわからなくて。



この投稿にコメントする

削除パスワード

No.18872

Re:文字列の検索
投稿者---rvrdriver(2004/12/25 08:48:20)


>多分、括弧の数が合っていないためだと思います。

このようなことになってしまうのは、インデントが正しくできて
いない場合に起きてしまうと思います。

インデントが合っていなくても、
viを使用しているなら%で括弧の対応が判りますし、
秀丸であれば対応する括弧を強調表示してくれる機能があります。
エディタの機能を活用するともっとエラーの少ないコードが
作成出来ます。



この投稿にコメントする

削除パスワード

No.18878

Re:文字列の検索
投稿者---れいな(2004/12/26 15:39:06)


ありがとうございます。
やり直してみます。すいません。


この投稿にコメントする

削除パスワード

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