writing nested while命令正确无误

问题描述 投票:0回答:1
#include <stdio.h>

int main() {
    // variables
    int door,base;
    char ch;
    int a,b,bin;
    int converter,converterC,controller = 0;
    printf("Welcome to Full Subtractor!\n");
    printf("\t(1)\tCompute and Display the outputs\n");
    printf("\t(2)\tQuit \n");
    printf("You choose:");
    scanf("%d",&door);

    while(door == 1)
    {
        printf("\nYou have chosen option %d\n",door);
        printf("Which base will you use to enter input (base 2 or base 16)? ");
        scanf("%d",&base);

        while(base == 2)
        {
            printf("Please enter your input: ");
            fflush(stdin);
            while(ch!= '\n')
            {

                scanf("%c", &ch);

                converter = ch - '0'; // convert char to int
                converterC = converterC+1;
                controller = controller+1;

                if(converterC == 0)
                {
                    a = converter;
                }
                else if(converterC == 1)
                {
                    b = converter;
                }
                else if(converterC == 2)
                {
                    bin = converter;
                }


            }


            if(controller <=3)
            {
                printf("\nYou entered less than 3 bits! Please try again!\n");
                break;
            }
            else if(controller > 4)
            {
                printf("\nYou entered more than 3 bits! Please try again!\n");
                break;
            }

        }
        while(base == 16)
        {
            printf("xxxxx");
        }

    }

    return 0;
}

我希望输出是这样的,但这不能正常工作:

欢迎使用全减法器!

(1) 计算并显示输出 (2) 退出 你选择:1 您已选择选项 1

您将使用哪个基数输入(基数 2 或基数 16)? 2个 请输入您的输入:111 D 是 1 Bout 是 1

欢迎使用全减法器!

(1) 计算并显示输出 (2) 退出 你选择:1 您已选择选项 1

您将使用哪个基数输入(基数 2 或基数 16)? 2个 请输入您的输入:22 基数 2 中的数字无效!请再试一次! 请输入您的输入:1110001 您输入了超过 3 位!请再试一次! 请输入您的输入:E 基数 2 中的数字无效!请再试一次!请输入您的输入:011 D 为 0 Bout 为 1

我想分开每个 ch 并转换为 int,我将用于一个一个地计算,但是这个 while 循环不能正常工作 我的输出: 欢迎使用全减法器! (1) 计算并显示输出 (2) 退出 您选择:1

您选择了选项1 您将使用哪个基数输入(基数 2 或基数 16)?2 请输入您的输入:1 请输入您的输入: 您输入的位数少于 3 位!请再试一次!

您选择了选项1 您将使用哪个基数输入(基数 2 或基数 16)?2

你输入的少于3位!请再试一次!

您选择了选项1 您将使用哪个基数输入(基数 2 或基数 16)?

---或 欢迎使用全减法器! (1) 计算并显示输出 (2) 退出 您选择:1

您选择了选项1 您将使用哪个基数输入(基数 2 或基数 16)?2 请输入您的输入:0000 请输入您的输入: 请输入 er 您的输入: 请输入您的输入: 请输入您的输入: 您输入了超过 3 位!请再试一次!

您选择了选项1 您将使用哪个基数输入(基数 2 或基数 16)?

我想要它再次询问输入。顺便说一句,数组和运算符是被禁止的。 我该如何解决?

c while-loop char scanf newline
1个回答
0
投票

对于初学者来说,

fflush

fflush(stdin);

有未定义的行为。

变量

ch
没有初始化

char ch;

所以这个 while 循环

while(ch!= '\n')

调用未定义的行为。

变量

converterC
也存在同样的问题,它也没有在这个语句中初始化和使用

converterC = converterC+1;

代码的另一个问题是在这个输入之后

scanf("%d",&base);

输入缓冲区包含对应于按下的 Enter 键的换行符

'\n'

所以这个

scanf

的电话
 scanf("%c", &ch);

立即读取换行字符。

在 while 循环之前,您可以再插入一个循环以从输入缓冲区中删除换行符

'\n'
like

while ( getchar() != '\n' );

原来的 while 循环最好重写为无限 while 循环,例如

while ( getchar() != ' ');

while( 1 )
{
    if ( scanf("%c", &ch) != 1 || ch == '\n' ) break;
    //...
}

并且不要忘记在每次进入 while 循环之前将变量

converterC
controller
初始化为零。

© www.soinside.com 2019 - 2024. All rights reserved.