【C言語】関数を使って文字列を検索して表示するプログラム

C言語 研修プログラム

ソフトウェア会社の研修時代に作成したプログラムです。
参考になればうれしいです。

今回の研修プログラムは、関数を使用してcharの配列から特定の文字列を検索するという内容です。

研修でこのプログラムを作成した目的です。
・配列操作に慣れる。
・C言語での文字列の扱いを理解する。

C言語での文字列の扱いは他の言語に比べて非常にシビアです。自分も理解して使えるようになるまでには時間がかかりました。

スポンサーリンク

Sample Code

/*****************************************************************************
関数を使って文字列を検索して表示するプログラム

<lesson_014.c> ver1.00
------------------------------------------------------------------------------
作成日:
作成者:

*****************************************************************************/
//---ヘッダーファイル---
#include <stdio.h>

/************************** static関数 ***************************************/

//----------------------------------------------------------------------------
// 関数名 : GetTargetStr
// 機  能 : 検索する文字列を入力する関数
// 戻り値 : void
//----------------------------------------------------------------------------
void GetTargetStr(
  char* str,         /* i:検索対象の配列 */
  char* sub          /* o:検索する文字列 */
)

{
  puts("検索する文字を入力してください。");
  scanf("%s", sub);  //検索する文字列の入力

  /* 検索文字列が検索対象の文字列よりも長い場合は再入力 */
  if(strlen(sub) > strlen(str))
  {
    puts("入力された文字が多すぎます。入力し直してください。\n");
    scanf("%s", sub);
  }

}


//----------------------------------------------------------------------------
// 関数名 : SerchStr
// 機  能 : 文字列を検索して一致した配列の添え字を返す関数
// 戻り値 : int (検索した文字列の先頭の添え字、またはエラー:-1)
//----------------------------------------------------------------------------
int SerchStr(   /* 戻り値: 成功:配列の添え字 失敗:-1 */
  char* str,    /* i:検索対象の配列 */
  char* sub     /* o:検索する文字列 */
)

{
  int i = 0;
  int j = 0;
  int result;   //戻り値の変数(エラー:-1)

  /* str、subのどちらかが終端になるまでループする */
  while(str[i] != '\0' && sub[j] != '\0')
  {
    if(str[i] == sub[j])  //文字が一致した場合は両方進める
    {
      i++;
      j++;
    }
    else  //一致しなかった場合
    {
      i = (i-j) +1; //検索対象の配列の添え字のみ1回ずつズラして検索する
      j = 0;        //検索文字列は先頭に戻す
    }
  }

  if(sub[j] == '\0') //検索文字列の後端まで進んだ場合(全て一致した時)
  {
    result = i-j; //iが進んだ場所から検索文字列の長さ(j)を引く
                  //一致した配列の添え字になる
  }
  else  //jが後端まで進んでいない場合(検索失敗:一致する文字列なし)
  {
    result = -1;
  }
  return result;
}


//----------------------------------------------------------------------------
// 関数名 : OutputStr
// 機  能 : 検索した文字列を表示する関数
// 戻り値 : void
//----------------------------------------------------------------------------
void OutputStr(
  char* str,      /* i:検索対象の配列 */
  int result,     /* i:表示する配列先頭の添え字 */
  int length      /* i:検索した文字列の長さ */
)

{
  int i = result;    //検索した先頭の添え字

  length += result;  //表示する文字列の後端

  printf("検索結果:");
  /* 検索結果の先頭から後端まで表示 */
  //例:defなら i = 3 length = 7
  for(i; i < length; i++)
  {
    printf("%c", str[i]);
  }
  printf("\n");
  printf("先頭の添え字は%2dです。\n", result);
}


/******************************************************************************
---main関数---
******************************************************************************/
int main(void)
{
  //配列の宣言
  char idxStr[] = {"abcdefghijklmnopqrstuvwxyz"};
  char targetStr[32];

  int length;       //文字数
  int result = 0;   //検索した配列の添え字、エラー:-1

  /* 検索する文字列を入力する関数 */
  GetTargetStr(     /* 戻り値:なし */
    idxStr,         /* i:検索対象の配列 */
    targetStr       /* o:検索する文字列 */
  );

  length = strlen(targetStr);  //検索する文字列の長さを求める

  /* 文字列を検索する */
  result = SerchStr(     /* 戻り値: 成功:配列の添え字 失敗:-1 */
             idxStr,     /* i:検索対象の配列 */
             targetStr   /* o:検索する文字列 */
           );

  if(result == -1)
  {
    printf("文字列が検索できませんでした。\n");
    return -1;  //-1を返してmain関数終了
  }

  printf("文字列が検索できました。\n");

  /* 検索した文字列を表示する */
  OutputStr(
    idxStr,      /* i:検索対象の配列 */
    result,      /* i:表示する配列先頭の添え字 */
    length       /* i:検索した文字列の長さ */
  );

  return 0;
}

実行例

その他:研修で作成したC言語プログラム

その他のC言語プログラムはこの投稿にまとめてあります!

C言語の初心者用コードなので是非活用して下さい。
【C言語】研修 サンプルプログラム集

コメント

タイトルとURLをコピーしました