C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kend

C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#1

投稿記事 by kend » 4ヶ月前

[1] 質問文
 [1.1] 自分が今行いたい事は何か
fgetsとsscanfを用いて、標準入力から2行の文字列を比較して一行目の文字が2行目に含まれているかどうかのプログラムを作成したいです。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

#include <stdio.h>
#include<string.h>
int main(void){
    
    char buf[1000];
    char str[1000];
    char abc[1000];
    fgets(str, sizeof(str), stdin);
    sscanf(str,"%s",buf);
    fgets(abc, sizeof(abc), stdin);
    sscanf(abc,"%s",buf);
    
    char xyz;
    xyz=strstr(abc,str);
    
    if(xyz!=NULL){
        printf("NG\n");
    }
    else{
        printf("%s",abc);
    }
}
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
実行時に一行目の文字列が2行目に含まれているのに、実行結果が2行目のみ表示されてしまいます。
例 標準入力から二行を入力
efg
abcefghi

実行結果
abcefghi
二行目にefgが含まれているのに、strstr()文の検索が上手く機能しないことに躓いております。
 [1.4] 今何がわからないのか、知りたいのか
一行目の文字列が含まれているのかを検索するためにstrstr()文で最適なのか、
もしstrstr()文が使い方が間違っているなら正しい使い方を知りたいです。
もし他に最適な関数があれば、その情報も知りたいです。

[2] 環境  
 [2.1] OS : Windows

[3] その他
 ・どの程度C言語を理解しているか
C言語は2020年10月末から学習を始めており、まだ理解を出来てない部分が多いです。

お手数をおかけしますが、よろしくお願いします。

参照魚
記事: 68
登録日時: 3年前

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#2

投稿記事 by 参照魚 » 4ヶ月前

strstr の使い方そのものはあっていると思います。

①sscanf の意図がわからないです。
sscanf(str,"%s",buf);
sscanf(abc,"%s",buf);
この2行(とbuff[1000])は不要かなと思います。

②char xyz;
ここは char* xyz が正しいです。
strstr の戻り値は char*です。

③実行結果が2行目のみ表示...
printf("%s",abc);なので2行目だけ(abc)が表示されるのは、プログラムの挙動しては間違っていないです。
何を表示したいのかを記載すると回答が得られやすいかと思います。

Meta3

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#3

投稿記事 by Meta3 » 4ヶ月前

コード:

#include<string.h>
int main(void){
    
    char test[20] = "abcefghi";
    char *p;
    p = strstr(test,"efg");
    printf("検索文字列が見つかった場所から表示→%s\n",p);
    return 0;
}
 
実行結果

コード:

c:\b>c1.exe
検索文字列が見つかった場所から表示→efghi

c:\b>
strstrの使い方
https://bituse.info/c_func/15

Meta3

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#4

投稿記事 by Meta3 » 4ヶ月前

scanfを使う

コード:

#include <stdio.h>
#include<string.h>
int main(void){
    char str[1000];
    char abc[1000];
    // fgets(str, sizeof(str), stdin);
    scanf("%s",str);
    
  // fgets(abc, sizeof(abc), stdin);
    scanf("%s",abc);
  
    char *xyz;
    xyz = strstr(abc,str);
    printf("検索文字列が見つかった場所から表示→%s\n",xyz);
    return 0;
}
 

Meta3

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#5

投稿記事 by Meta3 » 4ヶ月前

見つかった時

コード:

c:\b>c1
efg
abcefghi
検索文字列が見つかった場所から表示→efghi

c:\b>c1
見つからない時 (null) がかえる

コード:

c:\b>c1
xyz
abcefghi
検索文字列が見つかった場所から表示→(null)
// fgets(str, sizeof(str), stdin);入力はstrstr は正常に動かなかった

アバター
みけCAT
記事: 6426
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#6

投稿記事 by みけCAT » 4ヶ月前

#2の指摘通り、sscanfの結果は使われていないので、sscanfの2行とbufの宣言は消してよさそうですね。
また、char xyzではなくchar* xyzとするべきですね。

fgetsは改行文字が入力された場合その改行文字もバッファに保存するので、
それを削除してからstrstrに渡さないとうまく検索できないという可能性があります。

コード:

#include <stdio.h>
#include<string.h>
int main(void){
    
    char str[1000];
    char abc[1000];
    fgets(str, sizeof(str), stdin);
    char* lf = strchr(str, '\n'); // 改行文字を探す
    if (lf != NULL) *lf = '\0'; // 改行文字があったら消す
    fgets(abc, sizeof(abc), stdin);
    
    char* xyz;
    xyz=strstr(abc,str);
    
    if(xyz!=NULL){
        printf("NG\n");
    }
    else{
        printf("%s",abc);
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6426
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#7

投稿記事 by みけCAT » 4ヶ月前

kend さんが書きました:
4ヶ月前
fgetsとsscanfを用いて、標準入力から2行の文字列を比較して一行目の文字が2行目に含まれているかどうかのプログラムを作成したいです。
「sscanfを用いて」という条件があるのですね。
うーん…返り値を作るのにでも使っておきましょうか。

コード:

#include <stdio.h>
#include<string.h>
int main(void){
    
    char str[1000];
    char abc[1000];
    fgets(str, sizeof(str), stdin);
    char* lf = strchr(str, '\n'); // 改行文字を探す
    if (lf != NULL) *lf = '\0'; // 改行文字があったら消す
    fgets(abc, sizeof(abc), stdin);
    
    char* xyz;
    xyz=strstr(abc,str);
    
    if(xyz!=NULL){
        printf("NG\n");
    }
    else{
        printf("%s",abc);
    }
    
    return sscanf("X", "%*d"); // 変換はできず、0が返る
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Meta3

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#8

投稿記事 by Meta3 » 4ヶ月前

コード:

#include <stdio.h>
#include<string.h>
int main(void){
    
    char str[1000];
    char abc[1000];
    fgets(str, sizeof(str), stdin);
    char* lf = strchr(str, '\n'); // 改行文字を探す
    if (lf != NULL) *lf = '\0'; // 改行文字があったら消す
    fgets(abc, sizeof(abc), stdin);
    
    char* xyz;
    xyz=strstr(abc,str);
     //       printf("%s",xyz);
    if(! xyz){
        printf("NG\n");
    }
    else{
        printf("%s",xyz);
    }
}


Meta3

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#10

投稿記事 by Meta3 » 4ヶ月前

gets(文字配列,sizeof(文字配列),stdin);
改行文字
gets関数は '\n' を格納しませんが、fgets関数は格納します。
入力の終わりを調べるには '\n' を検索して下さい。

gets とか scanf 使えばいいけど fgets には注意ですね
https://9cguide.appspot.com/22-01.html#S1

kend

Re: C言語の課題演習において、strstrを用いた文字列の比較についてのご質問です。

#11

投稿記事 by kend » 4ヶ月前

この度は皆さんアドバイスありがとうございました。

fgetsとsscanfではなく、scanf()を用いて入力することでランタイムエラーが解消されて無事実行できました。
ソースコードや詳しい解説までつけて頂き初心者の私でもとても分かりやすかったです、ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る