[问题] switch...case的问题

楼主: marx625001 (Dain)   2017-09-08 10:23:24
开发平台(Platform): (Ex: Win10, Linux, ...)
Win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Dev C++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
stdio.h stdlib.h
问题(Question):
为什么我的switch...case,无法成功加载,会直接跳default:("Error\n);
喂入的资料(Input):
预期的正确结果(Expected Output):
printf("Choice your mode: A.Read B.Write C.Randread D.Randwrite E.Randr
F.RWmixread=70 \n");
scanf("%c", &mode);
输入A.B.C.D.E等,会printf出来结果
错误结果(Wrong Output):
结果直接跳到Error
程式码(Code):(请善用置底文网页, 记得排版)
#include<stdio.h>
#include<stdlib.h>
int main()
{
char filename[10];
int iodepth, bs, size, numjobs, runtime;
printf("Where is your file? (absult postion)\n");
scanf("%s", filename);
printf("Setting your IO module(default=1)\n");
scanf("%d", &iodepth);
printf("What is your I/O size(-bs)?\n");
scanf("%d", &bs);
printf("How much the test file size\n");
scanf("%d", &size);
printf("How many your number of jobs?\n");
scanf("%d", &numjobs);
printf("How long do you wany to test?(sec)\n");
scanf("%d", &runtime);
char mode;
printf("Choice your mode: A.Read B.Write C.Randread D.Randwrite E.Randrw
F.RWmixread=70 \n");
scanf("%c", &mode);
switch(mode)
{
case 'A':
printf("Fuck u\n");
printf("fio -filename=%s -direct=1 -iodepth %d -thread -rw=read
ioengine=libaio -bs=%dm -size=%dG -numjobs=%d -runtime=%d -group_reporting
-name=mytest\n", filename, iodepth, bs, size, numjobs, runtime);
break;
case 'B':
printf("fio -filename=%s -direct=1 -iodepth %d -thread -rw=write
ioengine=libaio -bs=%dm -size=%dG -numjobs=%d -runtime=%d -group_reporting
-name=mytest\n", filename, iodepth, bs, size, numjobs, runtime);
break;
case 'C':
printf("fio -filename=%s -direct=1 -iodepth %d -thread
-rw=randread ioengine=libaio -bs=%dm -size=%dG -numjobs=%d -runtime=%d
-group_reporting -name=mytest\n", filename, iodepth, bs, size, numjobs,
runtime);
break;
case 'D':
printf("fio -filename=%s -direct=1 -iodepth %d -thread
-rw=randwrite ioengine=libaio -bs=%dm -size=%dG -numjobs=%d -runtime=%d
-group_reporting -name=mytest\n", filename, iodepth, bs, size, numjobs,
runtime);
break;
case 'E':
printf("fio -filename=%s -direct=1 -iodepth %d -thread
-rw=randrw ioengine=libaio -bs=%dm -size=%dG -numjobs=%d -runtime=%d
-group_reporting -name=mytest\n", filename, iodepth, bs, size, numjobs,
runtime);
break;
default:
printf("Error\n");
}
return 0;
}
补充说明(Supplement):
作者: Hazukashiine (私は幸せです)   2017-09-08 10:32:00
你先把 mode 印出来看看啊
作者: Django (Cython)   2017-09-08 10:52:00
可能因为code有脏话被和谐了
楼主: marx625001 (Dain)   2017-09-08 11:02:00
呜呜呜 那句话是因为翻烂了一堆C语言的书,还是没结果我用printf看了下,mode没答案
作者: stucode   2017-09-08 11:05:00
大小写?mode没答案? 那八成是吃到换行了
作者: Django (Cython)   2017-09-08 11:16:00
应该是runtime的换行被mode吃进去了吧
楼主: marx625001 (Dain)   2017-09-08 11:17:00
吃进去? 那请问要怎么解决这问题??
作者: stucode   2017-09-08 11:19:00
先把换行吃掉再scanf就好
作者: enonrick (EnonRick)   2017-09-08 11:20:00
getc(stdin)
作者: shadow0326 (非议)   2017-09-08 11:20:00
scanf(" %c", &mode); 试试看
楼主: marx625001 (Dain)   2017-09-08 11:24:00
s大,我资质余吨,刚入写程式,所以还是有点不太了解可以给我关键字之类的,我很愿意自己google学习enonrick 我还没用过那个指令过,我会上网查的shadow0326 我刚试过,他还是显示Error
作者: james732 (好人超)   2017-09-08 11:28:00
scanf newline ←用这个google?
作者: stucode   2017-09-08 11:32:00
一时之间想不到用什么关键字可以找到相关问题……也许可以试试scanf input buffer之类的简单来说就是上次输入的时候,例如输入123然后[Enter]输入缓冲区会填入"123\n"。上个scanf只consume掉整数的"123"部分,下一个scanf("%c", ...)读到的就是还留在buffer里面的"\n"。
作者: moebear (萌熊)   2017-09-08 11:37:00
吃到换行了 scanf前面放一个getchar把它吃掉就好
作者: stucode   2017-09-08 11:39:00
所以只要想办法把那个"\n"吃掉就好,楼上说的getchar()就是其中一个方法。
作者: Django (Cython)   2017-09-08 11:41:00
或是这样 scanf("%d\n", &runtime);
作者: shadow0326 (非议)   2017-09-08 11:42:00
https://ideone.com/1c9N0a 为什么我可以QQ
作者: Django (Cython)   2017-09-08 11:42:00
还有是Choose your mode不是Choice... (离题)
楼主: marx625001 (Dain)   2017-09-08 11:44:00
那我想再问一下,到底怎么看出来的啊?因为我都看书书上没解释到这个过shadow0326 那我再试试看,可能我有地方少打
作者: moebear (萌熊)   2017-09-08 11:55:00
摁...... IDE可以设中断点观察变量的值 可以发现mode吃到'\n' 之后应该会发现是scanf的问题 去google scanf 换行就可以找到一些想看的东西
作者: stucode   2017-09-08 12:13:00
有些入门书会省略细节,没有解释。C Primer Plus中好像有提到这方面的东西。不过其实主要还是像楼上说的,用debugger观察然后再google问题。
楼主: marx625001 (Dain)   2017-09-08 13:20:00
感谢各位大大的帮忙,我已经成功可以输出进到switch了
作者: Lipraxde (Lipraxde)   2017-09-08 14:28:00
scanf前先用fflush(stdin)应该也可以解决这问题
作者: james732 (好人超)   2017-09-08 17:08:00
fflush(stdin)记得不是标准做法https://i.imgur.com/A76Phy7.jpg
作者: Lipraxde (Lipraxde)   2017-09-08 17:15:00
谢谢J大,受教了
作者: james732 (好人超)   2017-09-08 17:30:00
有人知道最早做fflush(stdin)的是哪个编译器吗XD其实我觉得所有编译器都做成清除stdin也不错?
作者: CoNsTaR ((const *))   2017-09-08 20:18:00
不这样做是因为以前有些硬件的限制没办法 flush stdin 吧?
作者: bben900911 (Ben)   2017-09-08 21:47:00
我自己的习惯上,只用printf大法时会在目标变量周围加上[],以防有什么肉眼看漏的东西被我忽略
作者: uranusjr (←這人是超級笨蛋)   2017-09-11 13:47:00
也有个可能是某些平台的 implementation 就有这个副作用然后被开发人员 exploit 之后就只好一直维护了

Links booklink

Contact Us: admin [ a t ] ucptt.com