• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列の探索)

文字列の探索プログラムの改良方法

このQ&Aのポイント
  • C言語で作成した文字列探索プログラムの改良方法を教えてください
  • コンパイル時の警告「問題のあるポインタの変換(関数 main)」について解決策を教えてください
  • ファイルを指定して文字列を探索するプログラムを作成しましたが、うまく動かないときの改良方法を教えてください

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

  • ベストアンサー
  • ret
  • ベストアンサー率40% (8/20)
回答No.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)
回答No.2

問題点 1 calloc の戻り値を明示的にキャストする必要あり 2 s1 = fp; unsigned char* に ファイルポインタを入れようとしている。 fscanf(), fread() で読み込んで処理 (fclose()を忘れずに (この場合mainを抜けるので不要かも知れないが、 癖をつける意味で…)) 3 strstrに対し、unsigned charを使っている char配列に変更 以上を気をつけてください。

blackcat-1983
質問者

補足

ありがとうございます。 訂正例を教えて下さるとうれしいです。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

まんなかよりやや下にある > s1=fp; というところが無茶です。 ファイルを読み込みたかったのかもしれませんが、 これでは読み込めません。 ファイルの内容を文字列として読み出すには、 fgets()などの標準関数を使います。 使い方は、説明すると煩雑になるし、 教科書には必ず書いてあるのでそっちを見てください。

関連するQ&A