3

我正在用 C 编写一个程序。在程序中,用户必须选择一个数字,1、2 或 3。我想构造代码,以便当用户输入一个不是 1 的数字时, 2或3,他/她将被告知“无效选择 - 再次选择”,然后他们将被带回程序的开始:

int main() {

    int choice;
    char response, Y, N;

    printf("Choose a shape from the following:\n 1.Sphere\n 2.Cone\n 3.Cylinder\n");

    scanf("%d",&choice);

    if(choice==1||choice==2||choice==3) {
        printf("Enter the radius, r\n");                             
    } else
        printf("Invalid selection, choose again.\n");

}

我想要的是,在出现“无效选择,再次选择”后,将用户带回到程序的开头,这样他们就可以再次输入他们的选择。我该怎么做?

4

6 回答 6

2

这是你要做的:

int choice;
char response, Y, N;
for (;;) {
    printf("Choose a shape from the following:\n 1.Sphere\n 2.Cone\n 3.Cylinder\n");

    scanf("%d",&choice);

    if(choice==1||choice==2||choice==3) {
        break;                    
    }
    printf("Invalid selection, choose again.\n");
}

一旦这个循环结束,提示输入半径。您几乎肯定需要另一个循环来防止输入半径的负值,因此不要在同一个循环中提示它。

于 2012-10-21T13:37:47.887 回答
1

为此使用while循环

int main()
{
    int choice;
    char response, Y, N;

    printf("Choose a shape from the following:\n 1.Sphere\n 2.Cone\n 3.Cylinder\n");
    while(1)
    {
        scanf("%d",&choice);

        if(choice==1||choice==2||choice==3)
        {
            printf("Enter the radius, r\n");                             
            //Maybe read the radius here
            scanf("%d",&radius);
            break;
        }
        else
            printf("Invalid selection, choose again.\n");
    }
}
于 2012-10-21T13:33:35.657 回答
0

使用do-while循环,循环直到正确的输入
这样做,添加选择 4 退出:

 do {
        scanf("%d",&choice);
int flag=0;
        if(choice==1||choice==2||choice==3) {
            printf("Enter the radius, r\n");                             
        } else {
            printf("Invalid selection, choose again.\n");
            flag=1;
        }
    } while(flag==1&& choice!=4);
于 2012-10-21T13:33:25.100 回答
0

有些人会反对这一点,但我认为在这些情况下,plain oldgoto是一种非常干净易读的做事方式,因为它强调了“正常”控制路径的线性:

int main(int arg, char *argv[])
{
    int choice;

choose_shape:
    printf("Choose a shape from the following:\n"
           " 1.Sphere\n 2.Cone\n 3.Cylinder\n");
    scanf("%d", &choice);
    if (choice < 1 || choice > 3) {
        printf("Invalid selection, please choose again.\n");
        goto choose_shape;
    }

    printf("Enter the radius, r:\n");
    ...
}

是的,人们抱怨过,goto所以让我再证明一下。

这是一个更复杂的版本,允许您按字母选择形状:

    char c;
    shape_t shape;
choose_shape:
    printf("Choose a shape: [s]phere, [c]one, c[y]linder:\n");
    scanf("%c", &c);
    switch (c) {
    cases 's':
        shape = SHAPE_SPHERE;
        break;

    case 'c':
        shape = SHAPE_CONE;
        break;

    case 'y':
        shape = SHAPE_CYLINDER;
        break;

    default:
        printf("Not a valid shape: %c\n", c);
        goto choose_shape;
    }

这是带有goto. 请注意,这引入了另一个变量 ,flag其唯一目的是摆脱该goto语句。由于该语句,您不能简单地break在此处使用(这是一个未标记goto的开头) 。switch由于额外的状态,我认为这更难阅读。它长了五行。

    char c;
    shape_t shape;
    int flag;
    for (flag = 0; !flag; ) {
        printf("Choose a shape: [s]phere, [c]one, c[y]linder:\n");
        scanf("%c", &c);
        switch (c) {
        cases 's':
            shape = SHAPE_SPHERE;
            flag = 1;
            break;

        case 'c':
            shape = SHAPE_CONE;
            flag = 1;
            break;

        case 'y':
            shape = SHAPE_CYLINDER;
            flag = 1;
            break;

        default:
            printf("Not a valid shape: %c\n", c);
            break;
        }
    }
于 2012-10-21T13:34:15.740 回答
0

这是您可以考虑的替代方案。请注意,用户输入的获取被分成一个函数,并且main()只调用该函数并在错误时循环。的读者main()可能并不关心您如何获得输入选择,那么为什么要让他们阅读呢?

还要注意我用过fgets,不是scanf。如果您运行您的版本scanf并输入一个非数字,该字符将无限期地保留在输入缓冲区中;scanf永远不会删除它,因为它正在寻找满足 %d 格式字符串的数字 - 因此是一个无限循环。您可以在(using )stdin之前尝试刷新,但该函数仍然无法正确处理关闭 (例如,在基于 shell UNIX 的系统上使用 ctrl-d )。scanffpurgestdin

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

static int get_shape(int *shape)
{
    char buf[10] = "";
    printf("Choose a shape from the following:\n"
           " 1.Sphere\n 2.Cone\n 3.Cylinder\n");

    if (!fgets(buf, sizeof buf, stdin)) { /* Note: fgets, not scanf */
        exit(1); /* ctrl-d */
    }
    *shape = strtol(buf, NULL, 0);

    if (*shape==1 || *shape==2 || *shape==3) {
        return 1;
    }
    printf("Invalid selection\n");
    return 0;
}

int main(int argc, char ** argv)
{
    int shape = 0;
    while (!get_shape(&shape)) {
        /* loop */
    }
    printf("Choice: %d\n", shape);
    return 0;
}
于 2012-10-21T15:50:09.860 回答
0

这是使用 while 循环进行的简单验证,我只是复制了您的代码并进行了一些调整,这里的代码将扫描来自用户的整数,"Enter the radius, r"并且仅当用户输入整数时才会继续打印12否则3程序将继续要求他输入正确的输入。

int main() {

    int choice;
    char response, Y, N;

    printf("Choose a shape from the following:\n 1.Sphere\n 2.Cone\n 3.Cylinder\n");

    scanf(" %d",&choice);
    while((choice<=1)||(choice>=3)){

            printf("Invalid selection, choose again.\n");
            scanf(" %d",&choice);
    }
    printf("Enter the radius, r\n");

}
于 2021-08-21T07:57:30.563 回答