関数実装問題
部分文字列の検索:
テストプログラムの例:
#include <stdio.h>
#define MAX_SIZE 30
char *find_substring(char *text, char *pattern);
void read_string(char str[]); /* 評価システムが提供、詳細は省略 */
int main()
{
char text[MAX_SIZE], pattern[MAX_SIZE], *position;
read_string(text);
read_string(pattern);
position = find_substring(text, pattern);
if (position != NULL)
printf("%d\n", position - text);
else
printf("-1\n");
return 0;
}
/* ここにコードを実装 */
入力例1:
The C Programming Language
ram
出力例1:
10
入力例2:
The C Programming Language
bored
出力例:
-1
実装コード:
char *find_substring(char *text, char *pattern)
{
int text_pos = 0;
while (text[text_pos] != '\0')
{
if (text[text_pos] == pattern[0])
{
int pattern_pos = 0;
while (text[text_pos + pattern_pos] == pattern[pattern_pos] && pattern[pattern_pos] != '\0')
{
pattern_pos++;
}
if (pattern[pattern_pos] == '\0')
return text + text_pos;
}
text_pos++;
}
return NULL;
}
プログラミング問題
文字列からの部分文字列削除:
入力例:
Tomcat is a male ccatat
cat
出力例:
Tom is a male
実装コード:
#include<stdio.h>
#include<string.h>
int main()
{
char source[81] = {0}, target[81] = {0}, temp[81];
fgets(source, 81, stdin);
fgets(target, 81, stdin);
// 改行文字を削除
source[strcspn(source, "\n")] = 0;
target[strcspn(target, "\n")] = 0;
while (strstr(source, target) != NULL)
{
int src_len = strlen(source);
int tgt_len = strlen(target);
char *found_pos = strstr(source, target);
strcpy(temp, found_pos);
int temp_len = strlen(temp);
strcpy(source + src_len - temp_len, temp + tgt_len);
}
printf("%s\n", source);
return 0;
}
文字列の循環左シフト:
入力例:
Hello World!
2
出力例:
llo World!He
実装コード:
#include<stdio.h>
#include<string.h>
int main()
{
char input[101] = {0}, result[101] = {0};
int shift_amount;
fgets(input, 101, stdin);
scanf("%d", &shift_amount);
// 改行文字を削除
input[strcspn(input, "\n")] = 0;
int str_length = strlen(input);
if (shift_amount > str_length)
{
shift_amount = shift_amount % str_length;
}
int result_index = 0;
// シフト後の位置からコピー
for (int i = shift_amount; i < str_length; i++, result_index++)
{
result[result_index] = input[i];
}
// 先頭部分を末尾に追加
for (int i = 0; i < shift_amount; i++, result_index++)
{
result[result_index] = input[i];
}
result[result_index] = '\0';
printf("%s\n", result);
return 0;
}
最長対称部分文字列:
入力例:
Is PAT&TAP symmetric?
出力例:
11
実装コード:
#include<stdio.h>
#include<string.h>
int main()
{
char text[1001] = {0};
int max_length = 0;
fgets(text, 1001, stdin);
// 改行文字を削除
text[strcspn(text, "\n")] = 0;
int text_length = strlen(text);
for (int start = 0; start < text_length; start++)
{
for (int end = start; end < text_length; end++)
{
int current_length = end - start + 1;
int is_symmetric = 1;
for (int i = 0; i < current_length / 2; i++)
{
if (text[start + i] != text[end - i])
{
is_symmetric = 0;
break;
}
}
if (is_symmetric && current_length > max_length)
{
max_length = current_length;
}
}
}
printf("%d\n", max_length);
return 0;
}