user-0 提问: scanf 第二次循环的时候我还没从键盘输入就自己读取了一个0? 

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-2
content: 引用 4 楼 zhagoodwell 的回复:#include <stdio.h> #include "string.h" #include "errno.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i;     char A[]= {"Mission0"};     while(1)     {         printf("===================================\n");         for(i=0; i<5; i++)             printf("=  %d.任务%d                        =\n",i+1,i+1);         printf("===================================\n");         do         {             printf("输入你要运行的任务数字号:");             scanf("%d",&pszKey);             while(getchar()!='\n');             if(pszKey<1||pszKey>5)                 printf("输入有误！请重新");         }         while(pszKey<1||pszKey>5);         printf("pszKey = %d\n",pszKey);         A[7]=pszKey+48;         sys_cmd(A);     }     return 0; }  改一下  A[7]=pszKey+48;

user: user-2
content: #include <stdio.h> #include "string.h" #include "errno.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i;     char A[]= {"Mission0"};     while(1)     {         printf("===================================\n");         for(i=0; i<5; i++)             printf("=  %d.任务%d                        =\n",i+1,i+1);         printf("===================================\n");         do         {             printf("输入你要运行的任务数字号:");             scanf("%d",&pszKey);             while(getchar()!='\n');             if(pszKey<1||pszKey>5)                 printf("输入有误！请重新");         }         while(pszKey<1||pszKey>5);         printf("pszKey = %d\n",pszKey);         A[7]+=pszKey;         sys_cmd(A);     }     return 0; }

user: user-2
content: 楼主 你好 我觉得这样更方便一些 也能拍错 至于字符串输入限制的我也有 我们私聊把 我QQ2423824433 下面是改的代码 #include <stdio.h>  #include "string.h" #include <stdlib.h> int sys_cmd(char * _pszcmd) {     printf("%s\n",_pszcmd);     system(_pszcmd);     return 0; 	 } int main(int argc, char **argv) {     int iCount = 0;     int iKey = 0; /*任务号*/     int pszKey,i; 	char A[]={"Mission0"};     while(1)     {         printf("===================================\n"); 	for(i=0;i<5;i++) 		printf("=  %d.任务%d                        =\n",i+1,i+1); 	printf("===================================\n");	 	do{         printf("输入你要运行的任务数字号:"); 		scanf("%d",&pszKey); 		while(getchar()!='\n'); 		if(pszKey<1||pszKey>5) 			printf("输入有误！请重新"); 	}while(pszKey<1||pszKey>5); 	printf("pszKey = %d\n",pszKey); 	A[7]+=pszKey; 	sys_cmd(A); } return 0; }

user: user-3
content: 百度scanf  它会在缓冲区保留回车符

user: user-4
content: while(1)         {             iCount = scanf("%c",&pszKey);             getchar();    /*接受输入缓存里的回车符-->'\n' */             printf("iCount = %d\n",iCount);             if(  iCount != 1)             {                 printf("不能多于一个参数\n");                      }             break;         } 改成上面的代码试试，这是因为%c输入，当你输入一个字符时，紧接着输入了回车，字符写到了内存里，但是在输入缓存里还残留这上次输入的回车符，下次输入时，回车符匹配了%c