0

関数strcasestrがどのように機能するかを確認する小さなプログラムを作成しています。

以下のコードは何をしますか:

  1. ユーザーにテキスト行を入力するように求めます。
    最初の入力blah bla blah blah the Word we are looking for. 例: 2 番目の入力例:Word

  2. プログラムが出力するものは次のとおりです。Word we are looking for.

  3. しかし、Segmentation fault (core dumped) エラーが表示されます。

fgets()間違った使い方をしている疑いがあります。入力を読み取るために使用するプログラムを実行するとscanf(もちろん、スペースなしで最初の入力を入力します)、プログラムが機能し、期待される出力が得られます。

セグメンテーション違反エラーの原因は何ですか? これを修正する方法は?

#define _GNU_SOURCE
#define max_buff 1000
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char *answer;
//char * strcasestr (const char *haystack, const char *needle);

void strip_crlf(char* s);

void strip_crlf(char* s)
{
    char* p = strpbrk(s, "\r\n");
    if (p) *p = '\0';
}

int main(){
  char fname[max_buff+1];
  char lname[max_buff+1];

  printf("Enter the line of text you are searching for ");
  //scanf("%s", fname);

  fgets(fname,max_buff,stdin);
  //printf("%s",fname);
  strip_crlf(fname);

  printf("Enter the search term ");
  //scanf("%s", lname);
  fgets(lname,max_buff,stdin);
  strip_crlf(lname);
  //printf("%s",lname);
  if((answer=strcasestr(fname,lname))!=NULL){

  // printf("now we have something in answer ");
    printf("%s\n",answer);
  }
  else
      printf(" strcasestr failed\n");

}

編集済み: 以下のコメント/回答で行われた提案を反映するため。プログラムは次のように出力します。

 strcasestr failed

...うーん。

Edit2: プログラムが動作するようになりました。皆様、ご協力ありがとうございました!

4

2 に答える 2

2

からの失敗をチェックしていませんがstrcasestr()、これは失敗しています。これは、ストリップしていない\n\r\n、入力からではないためです。

成功する唯一の検索は、最初の入力の末尾に一致する場合です。

CRLF を削除するには:

void strip_crlf(char* s)
{
    char* p = strpbrk(s, "\r\n");
    if (p) *p = '\0';
}

そのstrip_crlf(fname);直後fgets。についても同じですlname

于 2013-10-05T01:52:29.653 に答える
2

結果を印刷する前に、比較が成功したかどうかを確認する必要があります。

if (answer) {
    printf("%s\n", answer);
} else {
    printf("No match\n");
}

比較が失敗する理由は、おそらくfgets()バッファーに改行が含まれているためですが、含まれてscanf()いないためです。比較を混乱させたくない場合は、文字列の末尾にある改行を削除する必要があります。

于 2013-10-05T01:53:10.510 に答える