1. 程式人生 > >C語言字元處理經典小程式

C語言字元處理經典小程式

逆序列印一句話

首先,說一下原理:用迴圈逐個讀取字元(所有字母均小寫),並儲存到一個一維字元陣列中直到遇到結束標誌為止。這裡的結束標誌分為三種情況,一是遇到換行符,二是超過了預設的句子長度(這裡設為200),三則是遇到了終止字元(句號.,問號?,感嘆號!)。然後再用一個迴圈搜尋陣列,找到最後一個單詞的起始位置,列印這個單詞。重複這個過程,直到到達陣列的起始位置,最後列印終止字元(如果有的話)。原始碼如下

#include <stdio.h>

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 <stdio.h>

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 <ctype.h>
#include <stdbool.h>
#include <stdio.h>

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語言程式設計現代方法》