用户输入一个秘密字,然后从字母表中选择一个字母,如果该字母在秘密字中,则变成星号.我认为问题出现在两个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;
}
Run Code Online (Sandbox Code Playgroud)
首先,有一个很大的逻辑错误.两个for循环:
for(i = 0; i < 27; i++)
{
for(k = 0; k < length; k++)
{
if(secretword[k] == alphabet[i])
{
secretword[k] = '*';
}
}
}
Run Code Online (Sandbox Code Playgroud)
说:
因为你在整个字母表中进行迭代,所以你将用'*'替换所有字符串.你可能想要的是:
for(k = 0; k < length; k++)
{
if(secretword[k] == guess)
{
secretword[k] = '*';
}
}
Run Code Online (Sandbox Code Playgroud)
代替.
还有一些其他问题.这需要在读取密码之后:
length = strlen(secretword);
Run Code Online (Sandbox Code Playgroud)
否则你会读取未经宣传的单词的长度.将其更改为以下内容:
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);
Run Code Online (Sandbox Code Playgroud)
这个:
scanf("%s", &guess);
Run Code Online (Sandbox Code Playgroud)
应该是:
scanf("%c", &guess);
Run Code Online (Sandbox Code Playgroud)
因为你打算只读一个char而不是一个字符串.
此外,这一行中的27个:
char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
Run Code Online (Sandbox Code Playgroud)
是正确的,因为您希望在字符串的末尾包含空终止符.
但是,这个:
for(i = 0; i < 27; i++)
Run Code Online (Sandbox Code Playgroud)
会读到alphabet[26],这将是一个'\0'.你可能不想'\0'在字符串中替换这些s(如果你只是为了strlen(secretword)字符,你就不会看到任何字符 - 因为strlen()计数到第一个'\0').将循环更改为仅限26个字符会阻止您执行不必要的传递secretword.它可能应该是
for(i = 0; i < strlen(alphabet); i++)
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好(如wildplasser所建议的):
char alphabet[] = {"abcdefghijklmnopqrstuvwxyz"};
....
for(i = 0; i < sizeof alphabet -1; i++)
Run Code Online (Sandbox Code Playgroud)
最后一件事 - 如果secretword数组中没有足够的空间来保存读入的字符串,程序将崩溃.您可以通过要求scanf只读取19个字符来解决这个问题:
scanf("%19s", &secretword);
Run Code Online (Sandbox Code Playgroud)
请注意,scanf将使用a终止字符串'\0',因此%19s最多可以将20个字节放入字符串中.
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |