こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

文字列の探索

ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

unsigned char *s1;
unsigned char *s2;
unsigned char *cp;
FILE *fp;
char fname[64];

void TestStrStr(void);

main(){

s1 = calloc(256, sizeof(unsigned char));
s2 = calloc(256, sizeof(unsigned char));


printf("Input Filename...");
scanf("%s",fname);
while(1){
fp = fopen(fname, "r");
if(fp == NULL){
printf("ファイルを開くことができません...\n");
printf("Input Filename...");
scanf("%s",fname);
}else break;
}


s1=fp;
//printf("文字列1を入力してください:");
//scanf("%s",s1);

printf("文字列2を入力してください:");
scanf("%s",s2);

TestStrStr();

return 0;
}


void TestStrStr(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);
}

投稿日時 - 2004-11-26 20:03:31

QNo.1101267

すぐに回答ほしいです

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char*s1;
char*s2;
char*cp;
FILE*fp;
charfname[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で統一しました。
後、グローバル変数もどうでしょうか?
関数にポインタで渡されては?

投稿日時 - 2004-11-26 21:00:50

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ret

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

以上を気をつけてください。

投稿日時 - 2004-11-26 20:24:41

補足

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

投稿日時 - 2004-11-26 20:29:06

ANo.1

まんなかよりやや下にある

> s1=fp;

というところが無茶です。
ファイルを読み込みたかったのかもしれませんが、
これでは読み込めません。

ファイルの内容を文字列として読み出すには、
fgets()などの標準関数を使います。
使い方は、説明すると煩雑になるし、
教科書には必ず書いてあるのでそっちを見てください。

投稿日時 - 2004-11-26 20:13:06

あなたにオススメの質問