写点什么

简单交互式页面的思考(C)

用户头像
Alex
关注
发布于: 2020 年 08 月 19 日

在写二分树结构时,做了一个简单的交互式页面

其中涉及到一个小问题我觉得很值得思考



while (ch!=5)
{
printf("------options list:\n");
printf("------Intert (1)\n");
printf("------Delete (2)\n");
printf("------Find key (3)\n");
printf("------Print tree (4)\n");
printf("------out (5)\n");
printf("------option:");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("Enter the key:");
scanf("%d",&key);
t=insertNode(t,key);
break;
case 2:
printf("Delete value:");
scanf("%d",&key);
t=deleteNode(t,key);
break;
case 3:
printf("find value:\n");
scanf("%d",&key);
if (findNode(t,key)!=NULL)
printf("%d is in the tree\n",key);
else
printf("%d is not in the tree\n",key);
break;
case 4:
printf("\nprinting-inorder (i)\nprinting-preorder (r)\nprinting-postorder (p):\n");
getchar();
scanf("%c",&temp);
if (temp=='i'){
printf("Inorder:");
printInorder(t);
}
else if(temp=='r')
{
printf("Preorder:");
printPreorder(t);
}
else
{
printf("Postorder:");
printPostorder(t);
}
printf("\n");
break;
case 5:
printf("Thanks Bye!\n");

其他的case很简单,基本上都是读取之后scanf一个数字

主要关注case4,因为进入case4之后还要进行选择打印的方式,上面的代码是我已经改进能够运行的情况。

第一次写的时候,我没有在中间加上getchar() 导致程序进入case4时,就一直循环,唯一能够解释的就是流的问题

在第一次输入选项时,我键盘上键入的是 4+enter

因此进入stdin(标准输入)的信息也是4+enter,但ch读取了整数4



所以stdin里面还有一个 \n 而case4里面刚好读取的是char.(如果是scanf读取整数,会自动跳过整数前的空白符,而char不会跳过)

所以问题就是getchar将\n读入,因此程序一直循环。



另外一种处理方式:读取字符串

利用scanf("%s",temp),但此时不能用 temp=="i" or "r"

显然左边是指针而右边是字面量,如果要比较得用string里面的函数。



最后我选择的处理方式,直接用getchar() 将stdin里面的\n读取出来,再处理



还可以使用刷新流的方式 fflush(stdin) 或者rewind(stdin),不过不同的编译器可能效果不同。



发布于: 2020 年 08 月 19 日阅读数: 47
用户头像

Alex

关注

在校带学生 2020.07.02 加入

还未添加个人简介

评论

发布
暂无评论
简单交互式页面的思考(C)