c语言中使用switch-case语句时,NULL是其中的一种情况,那么在键盘上如何输入才能转到这种情况?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中使用switch-case语句时,NULL是其中的一种情况,那么在键盘上如何输入才能转到这种情况?相关的知识,希望对你有一定的参考价值。

代码:
#include <stdio.h>
main()

char b;
scanf("%c",&b);
switch(b)

case 'A':
printf("input is A!\n");
break;
case NULL:
printf("input is NULL!\n");
break;
default:
printf("sorry!\n");
break;



如上,怎么输入能转到第二种情况??谢谢!

这个某些编译器是不能通过的。
我先说一下NULL的基本知识,然后再说如何出现第二个条件,然后提出这个程序中的错误。

因为NULL一般在C语言里面作为空指针来使用。而在C语言庞大的头文件中去搜索一下,不难发现,一般NULL的定义有下面的两种:
#define NULL 0
#define NULL (void *)0
可见,它的值是0,而在某些条件下(如严格检查类型的编译器)会作为指针类型来检查。这样就不能编译通过了。所以某些编译器会报错:不能将指针类型作为整数。

按现在的代码,如果想编译通过很简单,在NULL前面加上一个(int)NULL就行了。也就是
case (int)NULL:
或者直接 case 0:

-----------------
下面说下如何进入第二个条件。
一般来说 scanf 输入%c字符的时候,是无法将0(也就是\'\\0\')这个值输入到变量的,即使什么都不输入,直接回车,也是将回车符10或13输入到变量中,除非没有输入流里第一个字节就是\\0字符。输入流可以用小于号来实现重定向。先创建一个第一个字节为\\0的文件(创建文件应该会吧),然后用 t.exe < t.txt 的方式,就会将t.txt作为输入流,从而触发第二个条件。

------------
下面说程序里的一个错误:b没有初始化。
在输入流没有任何内容直接中断的时候,变量b的值不会被改变,即未初始化状态。
中断输入流在linux的shell里面很简单,Ctrl+D,而windows、dos里,使用默认输入流(控制台)里面怎样输入我还没有发现。不过可以用另外的方法:用小于号将输入流定向到空文件。如
LINUX里面: $ ./t < /dev/null
WINDOWS里面: c:\\> copy nul empty.txt (创建一个空文件)
c:\\> t.exe < empty.txt
这样执行,b的值就不被改变,其结果可能是0~255之间任何的值,不同的编译器结果是不同的。有的编译器会默认初始化为0,而有的可能是0xCC的值,所以直接用它是比较危险的。而如果在初始化时 char b = \'\\0\'; 的话,用上面的方法运行就会得到你想要的”input is NULL!“

中断输入流在linux的shell里面很简单,Ctrl+D,而windows、dos里,使用默认输入流(控制台)里面怎样输入我还没有发现。
参考技术A 我觉得你可以这样编写:
代码:
#include <stdio.h>
main()

char b;
scanf("%c",&b);
switch(b)

case 'A':
printf("input is A!\n");
break;
default:
printf("input is NULL!\n");
printf("sorry!\n");
break;

参考技术B 应该是你输入的字符在内存中地址为空吧!个人觉得~ 参考技术C 编译能通过?追问

能通过啊

追答

什么编译器?

追问

vc6.0

java中如何能避免过长的switch-case分支语句?

要编写一个网络程序,socket连接。客户端传上来的都是一些状态码,比如100代表登录,101代表注册等等。这样的状态码大约有800多个

在服务器端,接收到不同的状态码,就要调用不同对象的不同方法,比如,登录就调用user.login(),注册就调用user.register(),等等.

这样,我使用switch-cash语句的话,这个类至少得2000多行。分支太多的话,效率会很低。

我考虑过使用配置文件加反射来实现。结果大量的反射处理同样把效率降得很低。

这种状况应该怎么处理呢?哪位大侠知道?
二楼的能不能详细一点,呵呵。想法不错,可是怎么实现呢,我读到末端,得到功能字符串,还是要使用反射执行啊?

java中使用if elseif 结构不会降低效率。
sun官方说明,java中的if是经过效率优化的。
反射的效率是if语句的1/10。(就是说反射是很慢的)
之前做电信项目的时候我就遇到过。

使用if语句几百个分支的效率是每秒几万次。效率非常高。
(当然if中是有逻辑的。)

如果你确实有800个的话。
有一个提高效率的方法。
就是把if分组
if(组一)

if()...

else if(组二)

if()...

每组对应一个类。
类中都实现do(int status)方法。
把状态的if else都放到每个类中的do方法中写。
这样代码清晰。而且由于分了组
每组100个左右,这样效率就更高了。
参考技术A 大约有800多个,就是分组,不要担心效率 参考技术B 我觉得的话应该构建一个树,有1个根结点,10个子节点(表示0-9),每个子结点再分10个子节点,再分..最末端的节点一共构成800多个,每个都存着你需要的功能
然后 读取状态码的时候从第1位读取,按照读出的数字(0-9),分支到下一个子节点,然后读取第二个数字,再分支,一直下去..

这样的话 一个4位的状态码只用执行4次switch,每个switch中判断10个case.而switch-case只写一次,剩下就是递归..不知这样效率如何.
参考技术C 貌似没啥好办法...按数字范围再分分块吧。

以上是关于c语言中使用switch-case语句时,NULL是其中的一种情况,那么在键盘上如何输入才能转到这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

C语言:用switch-case编写;从键盘输入当月利润求奖金总数。

我们可以在c中使用带有字符串的switch-case语句吗? [重复]

java中如何能避免过长的switch-case分支语句?

零基础学C语言知识总结四:if-else判断语句和switch-case选择语句

零基础学C语言知识总结四:if-else判断语句和switch-case选择语句

有啥方法可以减少程序中条件语句if-else或者switch-case的过多嵌套?