user-0 提问: C语言Switch语句

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin); 		if (strlen(s)>10) { 			printf("Input too long(>9)!\n"); 			continue; 		}         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

user: user-2
content: scanf有问题，只能输入整形

user: user-3
content: 建议楼主在使用系统接口时，先熟知其定义及返回值；如scanf的函数原型为： int scanf(const char * restrict format,...); 它的返回值定义如下： scanf函数返回成功读入的数据项数，读入数据时遇到了“文件结束”则返回EOF；当返回0时，表示实际没有成功读入对应数据。  回到楼主的测试代码，我稍微修改了，一下子就能发现问题了：注意有2个问题，一是a未初始化，而是未判断scanf的返回值；#include <stdio.h>  void main(void) {     int a; //这里定义a是未初始化的，理论上它的值是随机的 	int ret; 	 	printf("1=====a=%d\n", a);     printf("请输入: ");     ret= scanf("%d",&a); //注意判断scanf的返回值 	printf("2=====a=%d， scanf ret=%d\n", a, ret); 	     switch(a)     {         case 1:            printf("输入了1。\r\n");            break;         case 0:            printf("输入了0。\r\n");            break;         default :            printf("输入错误!\r\n");            break; 	} }  修正后的测试代码如下： void main(void) {     int a = -1; //这里定义a时初始化为-1 	int ret; 	 	printf("1=====a=%d\n", a);     printf("请输入: ");     ret= scanf("%d",&a); //注意判断scanf的返回值 	printf("2=====a=%d， scanf ret=%d\n", a, ret); 	 	if (ret != 1) { //判断scanf的返回值，当ret不为1时(读入1个整数)，表示输入错误 		printf("输入错误!\r\n"); 		return; 	} 	     switch(a)     {         case 1:            printf("输入了1。\r\n");            break;         case 0:            printf("输入了0。\r\n");            break;         default :            printf("输入错误!\r\n");            break; 	} }  测试记录如下： root@liluchang-ubuntu:/share/llc/test_scanf# ./test_scanf  1=====a=-1 请输入: 777777777 2=====a=777777777， scanf ret=1 输入错误!  root@liluchang-ubuntu:/share/llc/test_scanf# ./test_scanf  1=====a=-1 请输入: 1 2=====a=1， scanf ret=1 输入了1。  root@liluchang-ubuntu:/share/llc/test_scanf# ./test_scanf  1=====a=-1 请输入: 0 2=====a=0， scanf ret=1 输入了0。  root@liluchang-ubuntu:/share/llc/test_scanf# ./test_scanf  1=====a=-1 请输入: gggggg 2=====a=-1， scanf ret=0 输入错误!  测试案例输入很大的整数、字符串、数字1和输0，均能得到预期效果。

user: user-4
content: 只定义了a为int型，如果a为字符就不能执行了

user: user-5
content: 引用 15 楼 Hello.Word 的回复:[quote=引用 14 楼 Hello.Word的回复:]代码没问题呀，非0即为真 case '1':printf（"输入了1"）；把1加单引号试试[/quote] 那你就要输入49才会回答“输入了1”。a是int类型也是%d输入的，应该用整数来运算。

user: user-6
content: VS2015调试没问题

user: user-7
content: 把a初始化不就行了？

user: user-8
content: 引用 14 楼 Hello.Word的回复:代码没问题呀，非0即为真 case '1':printf（"输入了1"）；把1加单引号试试

user: user-8
content: 代码没问题呀，非0即为真

user: user-9
content: 我在我的编译器上跑了一下代码，并没有出现楼主所说的问题。但是以防万一，最好还是把a初始化。

user: user-10
content: 应该就是int 和char类型不匹配，使scanf错误

user: user-11
content: 变量改成char 类型吧      类型不匹配出问题是很正常的  （C语言中， 用int 定义变量，采用scanf("%d")函数进行数据输入时，如果按下了非数字键，则scanf()函数会返回错误。）

user: user-12
content: 输入的有问题吧

user: user-13
content: 加一句这个试试？ default：        fflush(stdin);        printf。。。。

user: user-14
content: 代码没有问题，应该是编译器的问题

user: user-15
content: 定义变量最好都初始化，好的习惯

user: user-16
content: 引用 2 楼 qq_33462307 的回复:[quote=引用 1 楼 自信男孩 的回复:] 输入非数字之外的，那么scanf执行会出现问题，即并没有把输入的内容放到a中，建议你这样操作时，先在scanf后面加上一条打印语句： printf("a = %d\n", a);你看一下a是什么值。 我猜是0 哈哈[/quote] 从结果来看是a的值是0。这个值应该是定义并初始化了0,（未初始化的局部变量是随机值，0也是可能的）

user: user-17
content: 执行switch 0，只是因为你编译器正好让a的默认值为0了而已。

user: user-17
content: scanf要求输入的字符类型为整型，如果输入了字符，应该是读取失败，本行语句没有对a进行操作。 可以把a设置一个初始值，如99，然后加上打印语句，运行后输入字符，发现a的值仍然是99。

user: user-18
content: 引用 1 楼 自信男孩 的回复:输入非数字之外的，那么scanf执行会出现问题，即并没有把输入的内容放到a中，建议你这样操作时，先在scanf后面加上一条打印语句： printf("a = %d\n", a);你看一下a是什么值。 我猜是0 哈哈