C语言程序不起作用?

CRS*_*CRS 0 c for-loop

用户输入一个秘密字,然后从字母表中选择一个字母,如果该字母在秘密字中,则变成星号.我认为问题出现在两个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)

Tim*_*nes 5

首先,有一个很大的逻辑错误.两个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个字节放入字符串中.