【问题标题】:Terminate program when "exit" is typed instead of first input data当键入“exit”而不是第一个输入数据时终止程序
【发布时间】:2017-02-06 22:20:23
【问题描述】:

当在第一个数据输入中输入诸如“exit”之类的单词时,我需要终止我的代码。我不知道实现这一点的正确功能或方法。我的数据是正确的,只需要用一个单词命令终止。请任何建议或提示与解释将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
    double xminA, xmaxA, yminA, ymaxA, xminB, xmaxB, yminB, ymaxB;
    double xminC, xmaxC, yminC, ymaxC;
    char end;
    while(1){
        printf("Rectangle A:");
        scanf("%lf%lf%lf%lf", &xminA, &yminA, &xmaxA, &ymaxA);
        printf("Rectangle B:");
        scanf("%lf%lf%lf%lf", &xminB, &yminB, &xmaxB, &ymaxB);

        if(xminA>xmaxB || xminB>xmaxA || yminA>ymaxB || yminB>ymaxA){
            printf("No overlapping area\n");

        }
        else if(xminA<=xmaxB || xminB<=xmaxA || yminA<=ymaxB || yminB<=ymaxA){
            xminC= fmax(xminA,xminB);
            xmaxC= fmin(xmaxA, xmaxB);
            yminC= fmax(yminA, yminB);
            ymaxC= fmin(ymaxA, ymaxB);
            printf("Overlap rectangle: (%lf,%lf) (%lf,%lf)\n", xminC, yminC, xmaxC, ymaxC);
        }
    }
    return EXIT_SUCCESS;
}

【问题讨论】:

  • 好吧,你必须允许用户输入“退出”,这一切都从检查scanf的返回值开始
  • 当前如果用户输入“退出”,程序会无限显示“无重叠区域”。
  • @KamiKaze:“fgets 已弃用”:什么?!不。你的意思是gets() 对吗?
  • @xing 和alk。你是对的,评论被删除

标签: c while-loop


【解决方案1】:

要做到这一点,您需要确认所有输入都是文本,然后您可以使用fgets()读取整行输入,检查是否为exit\n,如果不是,则继续将输入转换为您想要的数字,检查它们是否已成功转换并在没有成功的情况下采取措施。

例子

char line[256];
if (fgets(line, sizeof line, stdin) == NULL)
    return -1; // Something bad happened
if (strcmp(line, "exit\n") == 0)
    return 0; // The user typed `exit'
if (sscanf(line, "%lf%lf%lf%lf &xminA, &yminA, &xmaxA, &ymaxA) == 4) {
    // Got the first rectangle, now do the same for the second
    // rectangle
}

如您所见,这应该是一个函数,以便您允许用户在第一个矩形输入成功后键入exit

这可以进一步细化,使您的用户感到非常舒适和快乐。

此外,由于您不检查 scanf() 的返回值,您的程序无法判断输入是否正确(预期的 4 个浮点数)或者是否失败,@ 987654326@返回一个值,看一些文档就能理解它的含义。

【讨论】:

  • 恐怕我不明白,你能在我的代码上添加 cmets 吗?或者如果有任何其他方式。
  • 方法很多,这一种简单易行。为什么不明白?还有什么?
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
    double t, xminA, xmaxA, yminA, ymaxA, xminB, xmaxB, yminB, ymaxB;
    double xminC, xmaxC, yminC, ymaxC;
while(1){
    printf("Rectangle A:");
    if (0 == scanf("%lf", &t)){ //<--this if() statement causes the function to terminate at a non-numeric
        printf("Program completed normally");
        break;
    }
    t=xminA;
    scanf("%lf%lf%lf",&yminA, &xmaxA, &ymaxA);
    printf("Rectangle B:");
    scanf("%lf%lf%lf%lf", &xminB, &yminB, &xmaxB, &ymaxB);

    if(xminA>xmaxB || xminB>xmaxA || yminA>ymaxB || yminB>ymaxA){
        printf("No overlapping area\n");

    }
    else if(xminA<=xmaxB || xminB<=xmaxA || yminA<=ymaxB || yminB<=ymaxA){
    xminC= fmax(xminA,xminB);
    xmaxC= fmin(xmaxA, xmaxB);
    yminC= fmax(yminA, yminB);
    ymaxC= fmin(ymaxA, ymaxB);
printf("Overlap rectangle: (%lf,%lf) (%lf,%lf)\n", xminC, yminC, xmaxC, ymaxC);
    }
}
return EXIT_SUCCESS;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2019-07-23
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多