用户输入一个密码,然后从字母表中选择一个字母,如果该字母在秘密字中,则变成星号。我认为问题出现在两个for循环中,因为它似乎没有用星号代替字母。
int main ()
{
char secretword[20] = {};
char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
char guess;
int i = 0, k = 0;
int length = 0;
length = strlen(secretword);
printf("You Get six chances to guess all of the letters in a phrase\n");
printf("Enter the secret word/phrase: ");
scanf("%s", &secretword);
printf("Past guesses: ");
printf("%s\n", alphabet);
printf("Guess a character: ");
scanf("%s", &guess);
for(i = 0; i < 27; i++)
{
for(k = 0; k < length; k++)
{
if(secretword[k] == alphabet[i])
{
secretword[k] = '*';
}
}
}
printf("%s", secretword);
return 0;
}
答案 0 :(得分:5)
首先,有一个很大的逻辑错误。两个for循环:
for(i = 0; i < 27; i++)
{
for(k = 0; k < length; k++)
{
if(secretword[k] == alphabet[i])
{
secretword[k] = '*';
}
}
}
表示:
因为你在整个字母表中进行迭代,所以你将用'*'替换所有字符串。你可能想要的是:
for(k = 0; k < length; k++)
{
if(secretword[k] == guess)
{
secretword[k] = '*';
}
}
代替。
还有一些其他问题。在读取密码后,需要:
length = strlen(secretword);
否则你会读取未经宣传的单词的长度。把它改成这样的东西:
printf("You Get six chances to guess all of the letters in a phrase\n");
printf("Enter the secret word/phrase: ");
scanf("%s", &secretword);
length = strlen(secretword);
另外,这个:
scanf("%s", &guess);
应该是:
scanf("%c", &guess);
因为您打算只阅读char
而不是字符串。
此外,这一行中有27个:
char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
是正确的,因为您希望在字符串的末尾包含空终止符。
但是,这个:
for(i = 0; i < 27; i++)
将阅读alphabet[26]
,这将是'\0'
。您可能不希望替换字符串中的这些'\0'
(如果您只使用strlen(secretword)
个字符,则不会看到任何字符 - 因为strlen()
计为最多第一个'\0'
)。将循环更改为仅限26个字符会阻止您对secretword
进行不必要的传递。应该是
for(i = 0; i < strlen(alphabet); i++)
或者,甚至更好(正如wildplasser所建议的那样):
char alphabet[] = {"abcdefghijklmnopqrstuvwxyz"};
....
for(i = 0; i < sizeof alphabet -1; i++)
最后一件事 - 如果你在secretword
数组中没有足够的空间来保存读入的字符串,你的程序将崩溃。你可以通过要求scanf只读取19个字符来解决这个问题:
scanf("%19s", &secretword);
请注意,scanf将使用'\0'
终止字符串,因此%19s
最多可以将20个字节放入字符串中。
答案 1 :(得分:2)
在使用实际字符串初始化secretword之前设置长度变量,因此长度将始终为零(或者垃圾,具体取决于编译器如何决定对可变密码字进行初始化)。
答案 2 :(得分:2)
尝试在length = strlen(secretword);
之后加scanf("%s", &secretword);
。如果没有输入任何内容,strlen()
将返回0,立即完成for循环。