繁体   English   中英

C语言程序不起作用?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM