ソフトウェア会社の研修時代に作成したプログラムです。
参考になればうれしいです。
今回の研修プログラムは、関数を使用して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言語】研修 サンプルプログラム集
コメント