我的代码循环次数比我想要的多,我怀疑我的getchar语句有问题

时间:2011-07-13 18:40:14

标签: c

首先,我要提前感谢大家。我非常期待在计算机科学领域取得进步,并在我变得更加熟练的时候帮助其他人。

现在这是我的代码:

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

#define RECORDS 30

/*Questions
Formatting display() - can we use spaces to format?
Is the patient structure supposed to be global or local in enter()?
*/

void enter();
void display();
void update();
void loadDisk();
void writeDisk();
void emptyDisk();
void sort();
void clear();

struct patient
{
    char * name;
    int age;
    double highBP, lowBP, riskFactor;
};

struct patient * db[RECORDS];
int counter = 0;

main()
{
    int flag = 1;

    while (flag == 1)
    {
        printf("---------------------------------------------------------\n");
        printf("|\t(N)ew record\t(D)isplay db\t(U)pdate record |\n");
        printf("|\t(L)oad disk\t(W)rite disk\t(E)mpty disk    |\n");
        printf("|\t(S)ort db\t(C)lear db\t(Q)uit          |\n");
        printf("---------------------------------------------------------\n");
        printf("choose one: ");

        char selection = getchar();

        printf("selection %c\n", selection);

        if ((selection == 'n') || (selection == 'N'))
        {
        //New record
        enter();
        }

        else if ((selection == 'd') || (selection == 'D'))
        {
        //Display db
        //printf("display %d\n", flag);
        display();
        }

        else if ((selection == 'u') || (selection == 'U'))
        {
        //Update db
        update();
        }

        else if ((selection == 'l') || (selection == 'L'))
        {
        //Load disk
        loadDisk();
        }

        else if ((selection == 'w') || (selection == 'W'))
        {
        //Write disk
        writeDisk();
        }

        else if ((selection == 'e') || (selection == 'E'))
        {
        //Empty disk
        emptyDisk();
        }

        else if ((selection == 's') || (selection == 'S'))
        {
        //Sort db
        sort();
        }

        else if ((selection == 'c') || (selection == 'C'))
        {
        //Clear db
        clear();
        }

        else if ((selection == 'q') || (selection == 'Q'))
        {
        //Quit
        flag = 0;
        }

        else
        {
        printf("not a vaild input\n");  
        }
    }
}

void enter()
{
    /*struct patient temp;

    printf("name: "); sscanf("%s", temp.name);
    printf("age: "); scanf("%d", temp.age);
    printf("high bp: "); scanf("%f", temp.highBP);
    printf("low bp: "); scanf("%f", temp.lowBP);

    db[counter] = (struct patient *) calloc(1, sizeof(temp));
    *db[counter] = temp;

    //printf("%s, %d, %f, %f", db[counter]->name, db[counter]->age, db[counter]->highBP, db[counter]->lowBP);
    counter++;*/
}

void display()
{

}

void update()
{

}

void loadDisk()
{

}

void writeDisk()
{

}
void emptyDisk()
{

}

void sort()
{

}

void clear()
{

}

运行时我遇到的问题是输入选项后菜单显示两次。我无法理解出错的地方,但我怀疑它与getchar有关,它存储了选择和新行字符,因此运行了两次。这也意味着最终的else语句将会运行,它会这样做。

我认为我已经对问题进行了三角测量,只是不确定如何修复它。提前谢谢!

4 个答案:

答案 0 :(得分:2)

如果问题出在getchar上,它看起来确实如此,为什么不使用不同的函数呢?

尝试更换:

char selection = getchar();

有了这个:

char selection;
scanf("%c",&selection);

如果您担心单个字符溢出,请对字符串执行scanf()并仅使用支票中的第一个字符:

char selection, selectionstr[20];
scanf("%s",selectionstr);
selection = selectionstr[0];

答案 1 :(得分:1)

getchar也会返回'\n'个字符。

答案 2 :(得分:0)

是的,问题是您的输入始终是一个字符串,至少有一个字符后跟换行符。如果选择为'q'或者使用除getchar之外的函数并修剪你的输入,我会改变你的循环以便它终止。

答案 3 :(得分:0)

我认为你可以使用诅咒来做到这一点! Here是一个您可能会觉得有用的网站。 Curses是c。

的光标控制库

从手册:

  

最初,终端可能处于cbreak模式,也可能不处于cbreak模式   遗传;因此,一个程序应该调用cbreak或nocbreak explic-   itly。大多数使用curses的交互式程序都设置了cbreak模式。   请注意,cbreak会覆盖raw。