2012-03-15 38 views
0

用户输入一个秘密词,然后从字母表中选择一个字母,如果该字母在秘密词中则变成星号。我认为问题出现在两个for循环中,因为它似乎没有用星号代替这个字母。C语言程序不起作用?

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; 
} 
+0

当您尝试调试时发现了什么? – 2012-03-15 00:20:07

+7

他发现作业不好玩。 – 2012-03-15 00:20:59

+0

英文字母中只有26个字母......除非您在字母表中包含空字符? – 2012-03-15 00:21:17

回答

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] = '*'; 
    } 
} 

改为。

还有一些其他问题。这必须是 secretWord中读入后:

否则你会读uninitalised字的长度。将其更改为这样的事情:

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将以终止字符串,因此%19s可能会将最多20个字节放入字符串中。

+0

'char alphabet [] =“abcdefghijklmnopqrstuvwxyz”;'和'for(i = 0; i wildplasser 2012-03-15 00:37:18

+0

除非我误解了'scanf',格式字符串应该是''%19s'',为空字节留出空间。 – 2012-03-15 05:25:27

+0

@AaronDufour完全正确。固定 – 2012-03-15 05:34:57

2

您可以设置长度可变之前secretWord中与实际字符串初始化这样的长度将始终为零(或垃圾取决于编译器如何决定initaliaze变量secretWord中)。

+0

所以我换出了只有一个数字strlen,现在当它打印输出是所有星号 – CRS 2012-03-15 00:27:03

+0

@ user1270405你需要做的strf后,你真的把数据放在secretword – 2012-03-15 00:30:15

2

试着把length = strlen(secretword);scanf("%s", &secretword);。无需输入任何内容,strlen()将返回0,立即完成for循环。