【问题标题】:Calling a function into an other function in C将一个函数调用到 C 中的另一个函数中
【发布时间】:2017-07-02 23:22:46
【问题描述】:

我有一个函数来验证数字是否为整数,然后我尝试将此函数调用到另一个验证数字是否在限制上的函数。首先它不返回值并返回扫描整数,我该如何解决?然后我输入的值很重要,10 总是 iVal。为什么?

 printf("Enter an integer between 10 and 20: ");
       iVal = getIntLimited(10, 20);

       printf("Your entered %d\n", iVal);

void flushKeyboard(void){
   char enter;
   do{
      scanf("%c", &enter);
   } while (enter != '\n');

}

int getInt(void){
   int  value;
   char nl;

   do{
      scanf("%d%c", &value, &nl);

      if (nl != '\n'){
         flushKeyboard();
         printf("Invalid integer, please try again: ");
         return value;      
      }

   } while (nl != '\n');
}

int getIntLimited(int lowerLimit, int upperLimit){

   int iVal;
   getInt() == iVal;

   if ((getInt() > lowerLimit) && (getInt() < upperLimit)){
      return iVal;
   }
   else{
   printf("Invalid value, %d < value > %d: ", lowerLimit, upperLimit);
   printf("\n");
   }
}

【问题讨论】:

  • 阅读minimal reproducible example 并用一个完整的工作示例更新问题,重现您的问题,并且可以剪切和粘贴以供人们测试。
  • @E.G.你忘了写返回值;在第一个函数中。并且您应该在第二个函数中声明一个变量,以获取第一个函数的返回值。例如 int value = getInt();
  • 我试过了,但不起作用。顺便说一句,我忘了提到另一个功能。 void flushKeyboard(void){ char enter; do{ scanf("%c", &enter); } 而(输入!='\n'); }
  • 这是未定义的行为。
  • 整个flushKeyboard解决方案很丑,不要使用scanf作为用户输入,使用fgetsfgetc,然后你可以使用sscanfatoistrtol 解析它。使用fgets 时,您不必为“刷新”输入编写变通方法。

标签: c function return


【解决方案1】:

正如Vlad from Moscow 所指出的,您需要将输入分配给一个变量并返回它。

您的getInt() 函数应该类似于:

int getInt(){
    int value;
    char nl;
    do{
        scanf("%d%c", &value, &nl);
        if (nl != '\n'){
            flushKeyboard();
            printf("Invalid integer, please try again: "); 
        }
    }while (nl != '\n');
    return value; //now you're returning the last scanned valid value!
}

另外,你调用了你的getInt()function 三次:

1st) 当你“输入”你的getIntLimited() 函数时。

2nd) 当你测试getInt() &gt; lowerLimit

3rd) 当你测试getInt() &lt; upperLimit

由于参数lowerLimitupperLimit 已经传递给函数getIntLimited(int lowerLimit, int upperLimit),因此您不需要为它们获取值。所以,我会将您的 getIntLimited(int lowerLimit, int upperLimit) 函数更改为:

int getIntLimited(int lowerLimit, int upperLimit){
    int value;
    value = getInt(); //assign the input value to a variable
    if(value > lowerLimit && value < upperLimit){
        return value; //now you're returning the value that you got on getInt()
    }
    else{
        printf("Invalid value, %d < %d > %d: ", lowerLimit, value, upperLimit);
        printf("\n");
   }
   return value; //now you're able to check for this value on the first printf: printf("Your entered %d\n", iVal);
}

【讨论】:

  • 顺便说一句,有一种更优雅的方式可以在 int getIntLimited(int lowerLimit, int upperLimit) 上返回 value,但我会留给你。
  • 好吧,你是对的。我的问题是返回值并调用函数一千次。它现在正在工作。顺便说一句,我想看看优雅的方式。但现在我会离开,因为我写了它。
  • @E.G.想一想:无论哪种方式,您都会在int getIntLimited(int lowerLimit, int upperLimit) 上返回您的值。唯一的区别是,如果输入值不在限制之间,您将显示一条消息。所以,你为什么不这样做:如果输入值不在限制之间,我会显示消息,然后返回值,否则只返回值。
  • 噢,明白了!我明白你在说什么。我已经改变了它。哇哇哇谢谢!
  • @E.G.很高兴我帮助了:)。不要忘记接受答案!
【解决方案2】:

希望这种方式对你有用

void flushKeyboard(void){
   char enter;
   do{
      scanf("%c", &enter);
   } while (enter != '\n');

}

int getInt(void){

   int  value;

   scanf("%d", &value);
   return value;
}


int getIntLimited(int lowerLimit, int upperLimit){

   int iVal;
   iVal = getInt();
   printf(" %d \n", iVal);

   if ( ( iVal > lowerLimit ) && ( iVal < upperLimit )){
      printf("OK in bound\n"); 
      return iVal;
   }

   else{

        printf("Invalid value, %d < value > %d: ", lowerLimit, upperLimit);
        printf("\n");
        exit(0);
    }

}


int main()
{

   printf("Enter an integer between 10 and 20: ");
   int iVal = getIntLimited(10, 20);

   printf("Your entered %d\n", iVal);

}   

您还可以将 woz(以上帖子)用于getInt(),并且代码功能不会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2017-11-04
    • 2017-10-16
    • 2014-10-02
    相关资源
    最近更新 更多