C言語における文字列処理の実装テクニック

関数実装問題

部分文字列の検索:

テストプログラムの例:

#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;
}

タグ: C言語 文字列処理 部分文字列 アルゴリズム

6月2日 23:18 投稿