複数条件でのカウントを行う方法

このQ&Aのポイント
  • C言語を使用して、複数条件でのカウントを行う方法について説明します。
  • 特定のファイルから複数の文字列を検索し、出現回数をカウントするプログラムです。
  • 検索対象のファイル名と複数の検索文字列を指定することで、それぞれの文字列の出現回数を求めることができます。
回答を見る
  • ベストアンサー

複数条件でのカウント

#include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 //ファイル検索 main () { FILE *fp; //ファイルポインタ char filename[256]; //ファイル名 char key[128]; //検索文字列 char c; int keylen; //検索文字列の長さ int i = 0; //検索文字列の位置 int search = FALSE; //検索中フラグ int count = 0; //検索文字列出現回数 //検索対象ファイル名と検索文字列を決定 printf("ファイル名を入力してください > "); scanf ("%s", filename); printf("検索文字列 > "); scanf("%s", key); keylen = strlen(key); //ファイルオープン if((fp = fopen(filename, "r")) == NULL) { printf("ファイルオープンエラー\n"); exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF){ if(search) { //検索中 //検索文字列に一致しない文字が現れた if(c !=key[i]) { search = FALSE; i = 0; } else { i++; } }else { //検索中ではない if(c == key[i]) { search = TRUE; i++; } } //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; search = FALSE; } } fclose(fp); printf("出現回数 %d\n", count); return 0; } というものを作りましたが、検索文字列を二つ指定したい場合はコンパイルの画面でどのように入力すればいいのでしょう

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

key1,key2のように検索文字列を2つ(とか配列)にして、 それぞれ処理するようにすればいいと思います。 現在は、1文字ずつ入力&チェックされていますが、 行をまたがるような検索文字列がないなら、 行でファイルを読み込み<string.h>strstr()を使うのが簡単だと思います。

関連するQ&A

  • 文字列のある行数を表示する

     お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #include <stdio.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 using namespace std; int main( ) { FILE *fp;//ファイルポインタ char filename[256];//ファイル名 char key[128];//検索文字列 char key2[128];//見つけた文字列の保存 int iCnt[128];//見つけた文字 char c;    int keylen;//検索文字列の長さ int i = 0;//検索文字列の位置 int search = FALSE;//検索中フラグ int count = 0;//検索文字列出現回数 int j = 0; //検索対象ファイル名と検索文字列をコンソール入力 cout << "ファイル名を入力してください⇒  "; cin >> filename ; cout << "検索文字列を入力してください⇒  "; cin >> key; keylen = strlen(key); if((fp = fopen(filename,"r")) == NULL)     { cout << "ファイルオープンエラー\n" ; exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF) { if(search) {//検索中       //検索文字列に一致しない文字が現れた    if(c != key[i]) { search = FALSE; i = 0; } else{  i++; } }   else{ //検索中ではない if(c == key[i]) { search = TRUE; i++; } }     //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; iCnt[i] = 1; search = FALSE; } } fclose(fp); cout << "出現回数は " << count << '\n'; //ファイル(filename)からの読み込み        ifstream ifs(filename); string buf; while(getline(ifs, buf) && ifs ) { // ここで行目数の処理を行っています。 j++; if((count++ && search = FALSE) == TRUE) { cout << j << "行目" << endl; } } return 0; }

  • ファイルの置換

    ファイルを置換するプログラムを作ったのですがうまく置換してくれません。コードは以下のように書きました。(コンパイラは出来ました) #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 main() { FILE *fp; char filename[256]; FILE *outfp; char outfilename[256]; char key[128]; char str[128]; char c; int p; int keylen; int i=0 ; int search=FALSE; int count =0; printf(" enter filename"); scanf("%s",filename); printf("seach word"); scanf("%s",key); keylen=strlen(key); printf("change word"); scanf("%s",str); if((fp=fopen(filename,"r"))==NULL) { printf("file open error"); exit(1); } strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp=fopen(outfilename,"w"))==NULL) { printf("file open error"); exit(1); } while((c=fgetc(fp))!=EOF) { if(search) { if(c != key[i]) { search=FALSE; for(p=0;p<i;p++) { fputc(key[p],outfp); } fputc(c,outfp); i=0; } else{i++;} } else { if(c==key[i]) {search=TRUE;i++;} else {fputc(c,outfp);} } if (keylen==i) { count++; fputs(str,outfp); search=FALSE; i=0; } } fclose(fp); fclose(outfp); printf("apperance number %d\n",count); return 0; } どこか間違っていますか?教えてください。

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • ファイル処理について

    大学の課題なのですが、何度取り組んでもエラーになるため、間違いのご指摘、または正答を教えていただけないでしょうか。 問題は以下のものです。 【問題】 ファイルから整数を読み込み,その値によってfpの読み込み位置をかえ,何度目の読み込みで0を読み込んだかを表示するプログラムを作成せよ. ファイルの内容の例 2,4,0, fpの読み込み位置を変えるにはfseekという関数を利用する. fseekの使い方: 現在の読み取り位置xだけずらすには, fseek(ファイルポインタ, x, SEEK_CUR); と記述する. STEP 1 データを一区切りで読み取る("2,"や"-4,"などの整数とコンマの組) 2 読み取ったデータに応じてfpを移動させる("2,"なら2移動,"-4,"なら-4移動) 3 0を読むまで繰り返す +++++*+++++fseek-exercise.c+++++*+++++ #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // (* ここに解答を書き加える *) while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // (* ここに解答を書き加える *) printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // (* ここに解答を書き加える *) } printf("%d回目です.",count); fclose(fp); return(0); } // 以上になります。 自分で作ったプログラムは以下のようになりました。 #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // fp = fopen(filename,"r"); if(fp == NULL){ printf("cannot open\n"); exit(1); } while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // c = fgetc(fp); printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // if(c > '0' || c< '9'){ i = atoi(&c); count++; if(i == 0){ break; } fseek(fp,i,SEEK_CUR); } } printf("%d回目です.",count); fclose(fp); return(0); } // どこを訂正していいのかわかりません。 どうぞ、よろしくお願いいたします。

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • C言語の質問です

    下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回 現れたかを数えるプログラムです。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int count[26]; int main(int argc, char *argv[]) { FILE *fp; char ch; int i; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありません\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } while((ch=fgetc(fp))!=EOF) { ch = toupper(ch); if(ch>='A' && ch<='Z') count[ch-'A']++; } for(i=0; i<26; i++) printf("%c は %d 回出現\n", i+'A', count[i]); fclose(fp); return 0; } 1)int count[26]; で、なぜ26なのかが分かりません。 2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。 3)よって、for文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • 2つのテキストファイルのマージについて

    現在C言語を学習中の超初心者の者です。C言語のファイル処理や関数、マージ、ポインタの処理に悪戦苦闘している日々を送っています(泣) 皆様に、是非、アドバイスを頂けたらと思い、投稿させて頂きました。 2つのテキストファイルを読み込み、それぞれ、ファイルの中身の文字列をソートし、昇順に並び替え、さらに、その2つのファイルをマージし、昇順に並び替え表示させる(関数を用いて)課題をクリアできずにいます。 int main(void) { char strAry1[20][20]; char strAry2[20][20]; //ファイル1"menber1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル1情報ソート sortString( ); //ファイル1ソート後出力 putOut( ); //ファイル2"kantoku1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル2情報ソート sortString( ); //ファイル2ソート後出力 putOut( ); return 0; } main()関数はこのようなイメージで考えているのですが、どうのように処理すればよいのでしうか?(泣)質問がアバウトで申し訳ありません。ちなみに、2つのテキストファイルの中身は (1) "menber1.txt"-------- takahara inamoto endou nakazawa komano abe nakamura (2) "kantoku1.txt"------ torushie ofuto jico oshimu kamo okada farukan です。一応、途中まで考えて、いきずまってしまったソースです。→ int getData(char *filename, int count, char ss[][20]); void putOut( char ss[][20], int count); void sortString( char ss[][20], int count); int main(void) { char strAry1[20][20]; char strAry2[20][20]; int count = 7; //ファイル1情報を取得 getData("menber1.txt", count, strAry1); //ファイル1ソート前出力 putOut( strAry1, count); //ファイル1情報ソート sortString(strAry1, count ); //ファイル1ソート後出力 putOut( strAry1, count); //ファイル2情報を取得 getData("kantoku1.txt", count, strAry2); //ファイル1ソート前出力 putOut( strAry2, count); //ファイル2情報ソート sortString(strAry2, count ); //ファイル2ソート後出力 putOut( strAry2, count); return 0; } //ファイル情報を取得  int getData(char *filename, int count, char ss[][20]) {      FILE *fp1; if((fp1 = fopen(filename, "r")) == NULL){ //ファイルオープン printf("ファイルオープンできません\n"); exit(1); } count = 0; while(fp1 != NULL){ fgets(ss[count], 20, fp1); //1行単位で文字列取得 if(feof(fp1)) break; count++; } fclose(fp1); return 0; } //ファイルを出力する void putOut( char ss[][20], int count) { int i; for(i=0; i<count; i++){ printf("%s",ss[i]); } printf("\n"); } //ファイルをソートする void sortString( char ss[][20], int count) { int i,j; char temp[20]; for(i=0; i<count-1; i++){ for(j=i+1; j<count; j++){ if(strcmp(ss[i], ss[j]) > 0){ strcpy(temp, ss[i]); strcpy(ss[i], ss[j]); strcpy(ss[j], temp); } } } printf("ソート後\n"); } 少しでも情報がほしいです(泣)皆様忙しいと思いますが、助言をお願い致します。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??