C语言程序不起作用?

时间:2012-03-15 00:19:03

标签: 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;
}

3 个答案:

答案 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循环。