[英]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.