- ベストアンサー
文字列の探索プログラムの改良方法
- C言語で作成した文字列探索プログラムの改良方法を教えてください
- コンパイル時の警告「問題のあるポインタの変換(関数 main)」について解決策を教えてください
- ファイルを指定して文字列を探索するプログラムを作成しましたが、うまく動かないときの改良方法を教えてください
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <stdlib.h> #include <string.h> char* s1; char* s2; char* cp; FILE* fp; char fname[64]; void TsetStrStr(void); int main(void) { s1 = (char*)calloc(256, sizeof(char)); s2 = (char*)calloc(256, sizeof(char)); printf("Input Filename..."); fgets(fname, 64, stdin); while(1){ fname[strlen(fname)-1] = '\0'; fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); fgets(fname, 64, stdin); }else break; } fgets(s1, 256, fp); fclose(fp); printf("文字列2を入力してください:"); fgets(s2, 256, stdin); s2[strlen(s2)-1] = '\0'; TsetStrStr(); (void)getchar(); return 0; } void TsetStrStr(void) { cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); } scanfは基本的にお勧めできないので、 全てfgetsで統一しました。 後、グローバル変数もどうでしょうか? 関数にポインタで渡されては?
その他の回答 (2)
- ret
- ベストアンサー率40% (8/20)
問題点 1 calloc の戻り値を明示的にキャストする必要あり 2 s1 = fp; unsigned char* に ファイルポインタを入れようとしている。 fscanf(), fread() で読み込んで処理 (fclose()を忘れずに (この場合mainを抜けるので不要かも知れないが、 癖をつける意味で…)) 3 strstrに対し、unsigned charを使っている char配列に変更 以上を気をつけてください。
- liar_adan
- ベストアンサー率48% (730/1515)
まんなかよりやや下にある > s1=fp; というところが無茶です。 ファイルを読み込みたかったのかもしれませんが、 これでは読み込めません。 ファイルの内容を文字列として読み出すには、 fgets()などの標準関数を使います。 使い方は、説明すると煩雑になるし、 教科書には必ず書いてあるのでそっちを見てください。
補足
ありがとうございます。 訂正例を教えて下さるとうれしいです。