0

很简单的程序:

int main (void)
    {
    int i = 0, length=0;
    char password[] = SECRET;
    char guess[10];

    for (i=0; i<3; i++){
        printf( "Enter the password: " );
        fgets (guess, 10, stdin );
        length=strlen(guess);
        guess[length]='\0';
        if(strcmp( guess, password ) == 0 ){
          printf("\aYou got it right!\n" );
          return 0;
          }
          else printf("You wrote %s Incorrect guess\n\n", guess);
    }
    puts("Sorry, you're all out of guesses");

    return 0;

}

但它不起作用。

即使在我可以让程序说的奇怪情况下:“你猜是'黑色'。对不起,密码是'黑色'” 认为某些隐藏字符,空格,垃圾信息或其他任何东西可能存在问题字符串比较,但我似乎找不到它是什么!

4

2 回答 2

5

如果您学习使用调试器,您可能会看到返回的字符串fgets()包含换行符,这与您比较的字符串不匹配。

这段代码有什么意义:

length=strlen(guess);
guess[length]='/0';

首先,我只能假设您的意思是\0而不是/0. 其次,strlen()通过定位空终止符来工作。那么找到终止符然后在同一位置编写终止符有什么意义呢?

于 2012-12-24T21:08:41.020 回答
1

而不是制作:

 length = strlen(guess);
 guess[length]='\0';  

你应该这样做:

char *s = strchr(guess, '\n');
if (s) {  
    // new line is found  
    *s = 0;  
} else {  
    // user has exceeded max chars  
    guess[sizeof(guess) - 1] = 0;  
}  

我建议您使用 strncmp 而不是 strcmp 以避免缓冲区溢出攻击。

于 2012-12-24T21:59:36.003 回答