簡體   English   中英

打印字母表中未使用的字符

[英]Print non used character in alphabet

我正在嘗試在 C 中創建一個程序,打印字母表中不在 gussed_character 中的字母。 所有未使用的字母都保存在 available_character 中。

代碼:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void letters(const char gussed_character[], char available_character[]){
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    int gussed_character_lenght = strlen(gussed_character);
    int alphabet_lenght = strlen(alphabet);
    int counter = 0;

    for(int i = 0; i<alphabet_lenght; i++){
        counter = 0;
        for(int j = 0; j<gussed_character_lenght; j++){
            if(alphabet[i] != gussed_character[j]){
                counter++;                              
            }
            if(counter == gussed_character_lenght){
                available_character[i] = alphabet[i];
            }           
        }
    }
    printf("%s", available_character);
}

int main(){
    char result[30];
    letters("arpstxgoieyu", result);  
}

代碼示例:

字母(“arpstxgoieyu”,結果);

使用了這些字母,程序應該打印這些字母:

bcdfhjklmnqvwz

但是我的程序打印了這個:

%bcd@fPhajklmn q

變量 tempString 的值為"bcdfhjklmnqvwz"

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void letters(const char gussed_character[], char *available_character){
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    int gussed_character_lenght = strlen(gussed_character);
    int alphabet_lenght = strlen(alphabet);
    int counter = 0;
    for(int i = 0; i<alphabet_lenght; i++){
        int is_inside = 0;
        for(int j = 0; j < strlen(gussed_character); j++){
            if(alphabet[i] == gussed_character[j]){
                is_inside = 1;
            }
        }
        if(is_inside == 0){ 
            available_character[counter] = alphabet[i];
            counter++;
        }
    }
    available_character[counter] = '\0';
}

int main(){
    char result[30];
    letters("arpstxgoieyu", result);  
    printf("%s", result);
} 

您的錯誤在此代碼段中:

            ...

            if(counter == gussed_character_lenght){
                available_character[i] = alphabet[i];
            }

            ...

當您確定gussed_character確實包含alphabet[i] ,您嘗試將該字符添加到available_character數組中。 但是,您將alphabet[i]放在available_character中的位置i處。 這意味着alphabet中位置i的字符被復制到available_character中的相同位置。 請注意,輸出字符串在與alphabet相同的位置包含未使用的字符:

"a b c d e f g h i j k l m n o p q r s t u v w x y z"    // alpabet

   | | |   |   |   | | | | |
   V V V   V   V   V V V V V   

"% b c d @ f P h a j k l m n   q"                        // output string

然后跳過的字符是未定義的,因為您沒有向那里寫入任何內容(這意味着它將采用當時發生在該內存位置的任何值的值,使其隨機)。

而不是將可用字符定位在位置i ,而是將其放在available_character的末尾。 您可以使用變量來跟蹤available_character字符字符串在位置alphabet[i]處的結尾。

我接受了您的要求並自己實現了它,因為我看到代碼還可以改進的一些點(除了錯誤之外):

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

void letters(const char* used_characters, char* available_characters){
    const char* alphabet = "abcdefghijklmnopqrstuvwxyz";
    unsigned int available_character_index = 0;

    for (const char* alphabet_letter = alphabet; *alphabet_letter != '\0'; alphabet_letter++) {
        bool character_is_used = false;
        for (const char* used_character = used_characters; *used_character != '\0'; used_character++) {
            if (*used_character == *alphabet_letter) {
                character_is_used = true;
                break;
            }
        }
        
        if (!character_is_used) {
            available_characters[available_character_index++] = *alphabet_letter;
        }
    }
    
    available_characters[available_character_index] = '\0';
    printf("%s", available_characters);
}

int main(){
    char result[30];
    letters("arpstxgoieyu", result);  
    
    return 0;
}

主要要點是:

  • 顯而易見的一個是錯誤修復。 我現在使用變量available_character_index來跟蹤available_characters字符串的結尾並將任何可用字符定位在那里,同時在添加字符時也要注意更新available_character_index
  • 您忘記終止available_characters字符串。 當您打印available_characters字符串時,這可能會導致終端失控。
  • 我認為從概念上講,通過使用一個從字符串開頭開始並在數組上工作直到遇到\\0 (空字符)的 char 指針來遍歷字符串在概念上更容易。 因此,我更改了 for 循環以使用它們而不是整數索引。
  • 我發現您使用counter變量有點令人困惑。 從我所收集,你增加它,只有當alphabet[i] != gussed_character[j]所以在最后,如果gussed_characters包含一些字符aphabet ,應該不再是相等strlen(gussed_characters) 這個條件確實有效,但它很混亂。 在這種情況下,布爾值更合適(簡單 == 更好)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM