[英]C language program that doesn't work?
用户输入一个秘密单词,然后从字母表中选择一个字母,如果该字母在秘密单词中,它将变成一个星号。 我认为问题出在两个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;
}
首先,存在很大的逻辑错误。 两个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]
,该alphabet[26]
将为'\\0'
。 您可能不想替换字符串中的这些'\\0'
(如果仅使用strlen(secretword)
字符,则不会看到任何内容-因为strlen()
strlen(secretword)
到第一个'\\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个字节放入字符串中。
您可以在使用实际字符串初始化秘密字之前设置length变量,以便将长度始终为零(或根据编译器决定对变量秘密字进行初始化的方式确定其是否乱码)。
尝试把length = strlen(secretword);
在scanf("%s", &secretword);
。 不输入任何内容, strlen()
将返回0,立即完成for循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.