【问题标题】:Weird statement loop奇怪的语句循环
【发布时间】:2017-08-20 21:37:58
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


//prototype
void input(int *);
void statements(int, int);
void print(int, int *);




void main()
{
   int num, guess;
   time_t t;

   srand((unsigned) time(&t));
   num=rand()% 100+1;

   printf("%d\n", num);

   input(&guess);
   statements(num, guess);

}



void input(int *guess)
{
   printf("Guess a number between 1 and 100: ");
   scanf("%d", &*guess);
}

void statements (int num, int guess)
{


   if(guess==num)
      printf("You have guessed correct! The number is: %d", num);
   else if(guess>num)
   {
      printf("The number you have guessed is too big\n");
      print(num, &guess);

   }
   else if(guess<num)
   {
      printf("The number you have guessed is too small\n");
      print(num, &guess);
   }

}




    void print( int num, int *guess)
    {

        printf("Guess again: ");
        scanf("%d", &*guess);
        statements(num, guess);
    }

基本上,我正在为一个猜谜游戏编写一个程序作为作业,用户不断尝试直到他/她的答案是正确的;但是,当我执行它时,如果用户第一次没有得到正确的结果,程序会一直告诉他这个数字太大了。不允许循环 例子: 85 猜一个 1 到 100 之间的数字:90 你猜的数字太大了 再猜:20 你猜的数字太大了 再猜一猜:

任何帮助将不胜感激

【问题讨论】:

  • 您是否尝试过在调试器中逐行执行代码?这样做,同时监控变量及其值,你应该能够自己弄清楚。
  • 一个很好的提示应该是你的编译器会给你的代码警告。您没有将正确的参数类型传递给所有函数调用。
  • 在不相关的注释中,当您调用scanf 来读取猜测时,变量guess 已经是一个指针。 &amp; 和取消引用 * 运算符的地址相互抵消。 &amp;*guess 等于普通的guess
  • 当您在print 内部调用statements(num, guess); 时,您传递的是一个指针并将其转换为一个int。正如@Someprogrammerdude 指出的那样,您的编译器会发出有关类型不匹配的警告。
  • 只是指出,main() 必须有一个返回类型“int”。

标签: c function if-statement


【解决方案1】:

除了 cmets 指出的问题外,您对递归的使用是一个潜在问题。如果用户一直猜错,你最终会炸毁调用堆栈。此外,指针引用的序列,取消引用,即&amp;* 没有做任何事情,所以你应该把它拿出来。因此,使用 while 循环而不是使用递归的正确代码应该是这样的:

void statements (int num, int guess)
{
    while (guess!=num) { 
        if(guess>num) {
            printf("The number you have guessed is too big\n");
            print(num, &guess);
        } else if(guess<num) {
            printf("The number you have guessed is too small\n");
            print(num, &guess);
        }
    }
    printf("You have guessed correct! The number is: %d\n", num);
}

void print( int num, int *guess)
{
    printf("Guess again: ");
    scanf("%d", guess);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多