【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] != '
/*****************************************************************************
関数を使って文字列を検索して表示するプログラム
<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;
}
' && sub[j] != '
/*****************************************************************************
関数を使って文字列を検索して表示するプログラム
<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;
}
') { if(str[i] == sub[j]) //文字が一致した場合は両方進める { i++; j++; } else //一致しなかった場合 { i = (i-j) +1; //検索対象の配列の添え字のみ1回ずつズラして検索する j = 0; //検索文字列は先頭に戻す } } if(sub[j] == '
/*****************************************************************************
関数を使って文字列を検索して表示するプログラム
<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;
}
') //検索文字列の後端まで進んだ場合(全て一致した時) { 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をコピーしました