【问题标题】:Guess the word: I/O C logic error猜词:I/O C 逻辑错误
【发布时间】:2012-12-24 21:04:51
【问题描述】:

相当简单的程序:

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;

}

但它不起作用。

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

【问题讨论】:

  • “它不起作用”是什么意思?您发布的代码甚至无法编译(char password[] = SECRET; 并且没有解释您要解决的问题。
  • @KenWhite SECRET,正如大写字母所暗示的那样,是一个常数,在这种情况下,它是在预处理器代码中定义的。密码本身并不重要
  • @Duncan:我们(他们无法访问您对代码的个人知识)应该如何知道这一点? (我不太在意密码是什么;硬编码为"password" 之类的值。)我们无法从这里看到您的屏幕,也无法读懂您的想法;如果您需要帮助解决问题,您的问题应该包含实际的、可编译代码来演示问题,并清楚地描述该问题是什么。 “它不起作用”不是问题描述;在您解释“不起作用”的含义之前,这是一个没有任何意义的声明。
  • @KenWhite 使代码可编译并不难。要获得可编译的代码,必须包含 #include#define SECRET。请注意声明“不起作用”在下一段中解释
  • @JanDvorak:不,要使代码可编译,需要本地 #define SECRET 或将其更改为 char password[] = "SECRET";,因为我们不知道这个问题的发布者的经验水平(基于发布的代码的简单性,它可​​以由从事新课程作业的人发布),并假设其他地方可能是 #defined 或不是 #defined(以及 CASE 是否暗示 #defined ) 是错的。至于是否解释了“不起作用”,我不同意您的评估,但感谢您的意见。 :-)

标签: c string io fgets


【解决方案1】:

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

这段代码有什么意义:

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

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

【讨论】:

  • 我相信这不是唯一的问题。查看@iccthedral 的评论
  • guess[length-1] = '\0' 会很快解决它,尽管length。应该是&gt;0
  • 错字结合错误的数组位置是问题所在。谢谢!
  • 如果您的密码长度为&gt;9,您就会遇到问题。请注意。
  • @iccthedral 如果您的意思是缓冲区溢出,fgets 的第二个参数是否会解决这个问题(除非它是一对一的)?
【解决方案2】:

而不是制作:

 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 以避免缓冲区溢出攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多