【问题标题】:how to terminate the program in c?如何在c中终止程序?
【发布时间】:2017-07-10 02:48:51
【问题描述】:

所以我完成了我的代码,它提供了所需的输出,但它不会终止!我该如何解决? 我试过退货,但没有找到合适的地方保存它 所以我完成了我的代码,它提供了所需的输出,但它不会终止!我该如何解决? 我试过退货,但没有找到合适的地方存放它

#include<stdio.h>

void get_input();   
void is_valid(int num);  
void print_pattern(int num);  

void main ()
{
    get_input();    
}

void get_input()
{
    int a;
    printf("Enter an odd number less than or equal to 9 and greater than 0 > "); 
    scanf("%d",&a);
    is_valid(a);
}

void is_valid(int num)
{
    if(num > 9)
        printf("You have entered a number greater than 9. Please try again.\n\n"); 
    else if (num < 1)
        printf("You have entered a number less than 1. Please try again.\n\n"); 
    else if (num % 2 == 0)
        printf("You have entered an even number. Please try again\n\n"); 
    else if (num >= 1 && num <= 9 && num%2!=0)    
        print_pattern(num);
    get_input();              
}

void print_pattern(int num)
{
    int j,k,l;
    for ( j = 0; j<num/2 ; j++ ){
        for ( k = 0; k<num/2 - j; k++){
            printf("  ");
        }
        for( l=0; l < (2*j + 1); l++){
            printf("%2d",l+1);
        }
        printf("\n");    
    }    

    for( l=0; l <num; l++) // to print middle
    {
        printf("%2d",l+1);
    }
    printf("\n");

    // to print bottom
    for ( j = 0; j<num/2 ; j++){
        for ( k = 0; k<j+1 ; k++){
            printf("  ");
        }
        for ( l=1; l< num - (2*j + 1); l++){
            printf("%2d",l);
        }
        printf("\n");
    }        
}

【问题讨论】:

  • 它做了什么而不是终止?卡在哪里了?
  • get_inputis_valid 之间存在相互递归。您需要允许其中一个返回而不调用另一个。您想决定何时退出?
  • 先开始缩进你的代码。
  • print_pattern(num); --> { print_pattern(num); return; }
  • 您遇到了设计问题。看起来你应该在 get_input() 中像do { /*print blablabla*/ } while(!is_valid()) 一样有一个循环,并且你的 is_valid() 不应该递归调用 get_input(),相反,它应该返回 0 表示假,1 表示真。

标签: c


【解决方案1】:

无限循环

main 调用 get_input 调用 is_valid 调用 get_input 在那里进行间接递归。

如果要终止,请为 num 输入一些 if 条件,例如 if (num &lt; 0) return

【讨论】:

    【解决方案2】:

    当您使用 if-else 语句时,您应该使用 {} 创建一个块,除非该块是单行的。

    例如,当你使用

    if(num > 9)
    printf("You have entered a number greater than 9. Please try again.\n\n"); 
    else if (num < 1)
    printf("You have entered a number less than 1. Please try again.\n\n"); 
    else if (num % 2 == 0)
    printf("You have entered an even number. Please try again\n\n"); 
    else if (num >= 1 && num <= 9 && num%2!=0)
    print_pattern(num);
    get_input();          
    

    它会被读作

    if(num > 9)
    {
        printf("You have entered a number greater than 9. Please try again.\n\n"); 
    }
    else if (num < 1)
    {
        printf("You have entered a number less than 1. Please try again.\n\n"); 
    }
    else if (num % 2 == 0)
    {
        printf("You have entered an even number. Please try again\n\n"); 
    }
    else if (num >= 1 && num <= 9 && num%2!=0)
    {
        print_pattern(num);
    }
    get_input(); 
    

    这将导致每次调用 is_valid() 时都会调用 get_input(),以无限循环结束。 为防止循环,仅在需要时插入对 get_input() 的调用。

    此外,请确保您的块(每个 { } 之间的部分)定义明确,并且您不会过早关闭它们或打开块而不关闭它们。这也可能导致循环,特别是如果在有循环的地方做错了。

    另外,关于 if-else 语句,最后一个 else-if 是多余的。如果num既不大于9,也不偶,也不小于1,则一定是合法输入,不需要在此处添加if语句。

    【讨论】:

    • 即使有条件地调用get_input()而不是每次都调用它会让程序终止,但每次满足条件时递归深度仍然会增加......他会更好地使用循环而不是递归。
    【解决方案3】:

    如果您的程序成功,main() 应该以 return 0 结尾。以下是您可以返回的一些状态码的简短说明:https://stackoverflow.com/a/22604382/1137699

    【讨论】:

    • 无论是否有显式的return,主程序都会终止——除非它有无限循环或无限递归的情况。
    • 其实main()在没有return的情况下会隐式返回0(如果已经到达终点)
    • @Dmitri 这只适用于 C99/C11。在其他标准中,返回值是未定义的。
    • 他的问题是 main 的结尾甚至没有到达,所以这不会做任何事情。
    • 这个程序的问题是get_input()永远不会返回。后面放什么都没关系。
    猜你喜欢
    • 2018-02-02
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多