user-0 提问: 本人小菜，请问怎么能使程序在不满足输入时提示用户，并重新等待用户输入

回复:
user: user-1
content: 再供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: while(scanf("%d%d",&n,&m)==2)   {        if (n <= 0 || m <= 0 )        {             printf("invalid arguments\n") ;             continue ;       }        ptr=(int(*)[m])malloc(n*m*sizeof(int));        for(int i=0;i<n;i++)         for(int j=0;j<m;j++)          {       scanf("%d",&ptr[i][j]);           printf("%-2d",*(*(ptr+i)+j));       }                }

user: user-0
content: if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }  这段比较巧，学习了了！非常感谢。。。嘻嘻

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }   非常感谢赵老师的指导，小菜有点函数还没学过，慢慢地研究下！非常感谢！多多指教哟。

user: user-1
content: #include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }

user: user-0
content: 自己搞定了，作为一个刚学C4个月的小菜，把代码贴出来，请高人指正，同时也想吸取点他人思路。 这是一个C99的二维VLA，的练习题，只是本菜想拓展下，按实用要求来写。最后就不多余地free()了。   #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int main(void) {      int n,m;    char ar[30];      int (*ptr)[m]; printf("pls enter 2 number n & m. \n");      while(gets(ar)&&ar[0]!='\0')   {       if(isalpha(ar[0]))      { 	 puts("pls number"); 	 continue; 	 }        n=atoi(ar);        puts("pls 2 nums");        gets(ar);        m=atoi(ar);         	   ptr=(int(*)[m])malloc(n*m*sizeof(int));        for(int i=0;i<n;i++)         for(int j=0;j<m;j++)          { 	      scanf("%d",&ptr[i][j]);           printf("%-2d",*(*(ptr+i)+j)); 	     }              }       return 0;   }

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:while(scanf("%d%d",&n,&m)==2)   {        if (n <= 0 || m <= 0 )        {             printf("invalid arguments\n") ;             continue ;       }        ptr=(int(*)[m])malloc(n*m*sizeof(int));        for(int i=0;i<n;i++)         for(int j=0;j<m;j++)          {       scanf("%d",&ptr[i][j]);           printf("%-2d",*(*(ptr+i)+j));       }                } 这么修改似乎对负数有用，但你想比较容易出现的错误应该是误输入字母，比如n=2, m=a;这种类型的错误！