C语言字符处理经典小程序

逆序打印一句话

首先,说一下原理:用循环逐个读取字符(所有字母均小写),并保存到一个一维字符数组中直到遇到结束标志为止。这里的结束标志分为三种情况,一是遇到换行符,二是超过了预设的句子长度(这里设为200),三则是遇到了终止字符(句号.,问号?,感叹号!)。然后再用一个循环搜索数组,找到最后一个单词的起始位置,打印这个单词。重复这个过程,直到到达数组的起始位置,最后打印终止字符(如果有的话)。源代码如下

#include 

int main(void)
{
    char ch, sentence[200] = { 0 }, terminating_char;
    int i, j, sentence_length = 0, current_word_length = 0;

    printf("Enter a sentence:");

    // 读入字符并存储到sentence数组中直到遇到结束标志为止
    for (i = 0; (ch = getchar()) != '\n' && i < 200; i++) {
        if (ch == '.' || ch == '?' || ch == '!') {
            terminating_char = ch;
            break;
        } else {
            sentence[i] = ch;
            sentence_length++;
        }
    }

    printf("Reversal of sentence:");

    // 逆序打印
    for (i = sentence_length - 1; i >= 0; i--) {

        // 搜索空格作为单词间的分界点,句首经过特殊处理以后也可使用与空格相同的方法打印单词
        if (sentence[i] == ' ' || i == 0) {

            // 对句首进行特殊处理
            if (i == 0) {
                i--;
            }

            // 找到空格后,逐个字符打印这个单词
            for (j = i + 1; j <= i + current_word_length + 1; j++)
                printf("%c", sentence[j]);

            current_word_length = 0;
        } else {

            // 统计当前这个单词的词长
            current_word_length++;
        }
    }
    printf("%c\n", terminating_char);

    return 0;
}

文本加密

这里使用的加密技术是最古老的凯撒加密,该方法把一条消息中的每个字母用字母表中固定距离之后的那个字母替代,如果越过了字母Z会绕回字母表的起始位置,并且当用户输入加密后的消息和字母移动的位置数目后还能解密,源代码如下

#include 

int main(void)
{
    char ch, message[80] = {0};
    int i, message_length = 0, shift_amount;

    printf("Enter message to be encrypted: ");
    for (i = 0; (ch = getchar()) != '\n' && i < 80; i++) {
        message[i] = ch;
        message_length++;
    }

    printf("Enter shift amount (1-25): ");
    scanf("%d", &shift_amount);

    printf("Encrypted message: ");
    for (i = 0; i < message_length; i++) {

        if (message[i] >= 'A' && message[i] <= 'Z') {
            printf("%c", ((message[i] - 'A') + shift_amount) % 26 + 'A');
        }
        else if (message[i] >= 'a' && message[i] <= 'z') {
            printf("%c", ((message[i] - 'a') + shift_amount) % 26 + 'a');
        }
        else {
            printf("%c", message[i]);
        }

    }
    printf("\n");

    return 0;
}

变位词检验

变位词指的是相同字母的重新排列,要检验一个单词是否是变位词可以通过三个循环来实现,第一个循环记录一个单词中每个字母出现的次数,每出现一次就加1,第二个循环类似于第一个循环但用减1记录次数,最后一个循环检验这个数组是否全为0,源代码如下

#include 
#include 
#include 

int main(void)
{
    int i, letter_count[26] = { 0 };
    char ch;
    bool is_anagram = true;

    printf("Enter first word: ");
    for (i = 0; (ch = getchar()) != '\n' && i < 30; i++)
        letter_count[tolower(ch) - 'a']++;

    printf("Enter second word: ");
    for (i = 0; (ch = getchar()) != '\n' && i < 30; i++)
        letter_count[tolower(ch) - 'a']--;

    for (i = 0; i < 26; i++) {
        if (letter_count[i] != 0) {
            is_anagram = false;
            break;
        }
    }

    printf("The words are ");
    if (is_anagram)
        printf("anagrams.\n");
    else
        printf("not anagrams.\n");

    return 0;
}

参考资料:《C Programming: A Modern Approach》,中文译名《C语言程序设计现代方法》

你可能感兴趣的:(C)