user-0 提问: C语言scanf输入

回复:
user: user-1
content: 9楼已给出答案了。我觉得。

user: user-2
content: 唉，这个就不清楚了，没听说过这样的用法，楼主要是能找到，麻烦说一下啊

user: user-0
content: 引用 12 楼 u012421456 的回复:楼主是想输入时自动有左边的1234还是自己输入？   右边两列数字才是要输入的，第一串数字占五列，然后空一格，第二个数字占两列，并且向右靠齐

user: user-3
content: 不论是scanf还是cin，都有个输入缓冲区，而在你多次输出间隔符，主要是回车的时候，很容易发生缓冲区数据的错误，所以，为了避免一些不必要的情况，需要每次输入完之后，自己处理一下缓冲区，思想就是这样，scanf有scanf的处理方法，cin有cin的处理方法。 我一般参考这个： #if 0     // safty method to absorb scanf buffer     int i,c;     while (1)     {         printf("input:");         if(scanf("%d",&i)!=EOF)         {             while((c=getchar())!='\n'&&c!= EOF){}         }         printf("out:%d\n",i);         //i here hold the last value     } #endif #if 0     // safty method to absorb cin buffer     int i;     while(1)     {         cout<<"input:";         cin>>i;         cin.clear();         cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );         cout<<"out:"<<i<<endl;         //i here hold the last value     } #endif

user: user-1
content: 引用 4 楼 user-4_ 的回复:原来scanf还可以这么用。 发现你的C语言老师是二把刀了吧。

user: user-4
content: 原来scanf还可以这么用。

user: user-1
content: #include <stdio.h> struct D {     double f;     int n; } d[4]; int i,j; int main() {     for (i=0;i<4;i++) {         while (1) {             printf("\nPlease input %d #.# #:",i+1);             fflush(stdout);             rewind(stdin);             if (3==scanf("%d%lf%d",&j,&(d[i].f),&(d[i].n))) {                 if (j==i+1) break;             }         }     }     return 0; }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.   没怎么看懂

user: user-1
content: 仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 楼主是想输入时自动有左边的1234还是自己输入？

user: user-0
content: 引用 10 楼 u012421456 的回复:有点不太懂楼主的图片，右边两列是输入吗？ 恩 是的 右边的两列是要求输入的数据

user: user-2
content: 有点不太懂楼主的图片，右边两列是输入吗？

user: user-1
content: 引用 7 楼 u014245881 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] #include <stdio.h> struct D {     double f;     int n; } d[4]; int i,j; int main() {     for (i=0;i<4;i++) {         while (1) {             printf("\nPlease input %d #.# #:",i+1);             fflush(stdout);             rewind(stdin);             if (3==scanf("%d%lf%d",&j,&(d[i].f),&(d[i].n))) {                 if (j==i+1) break;             }         }     }     return 0; }   主要有严格的格式控制，第一串数字占五列，然后空一格，第二个数字占两列，并且向右靠齐[/quote] 没实际编译链接调试，不保证对，仅供参考： #include <stdio.h> int i,j,n,r; char s1[6]; char s2[3]; char c1,c2; double d; int main() {     for (i=0;i<4;i++) {         while (1) {             printf("\nPlease input ##### ##:");             fflush(stdout);             rewind(stdin);             if (4==scanf("%5[0-9.]%c%2[0-9 ]%c",s1,&c1,s2,&c2)) {                 if (c1==' ' && c2=='\n') {                     if (1==sscanf(s1,"%lf%n",&d,&n)) {                         if (n==5) {                             if (1==sscanf(s2,"%d%n",&j,&n)) {                                 if (n==2) {                                     break;                                 }                             }                         }                     }                 }             }         }     }     return 0;

user: user-0
content: 引用 6 楼 chuai1609 的回复:不论是scanf还是cin，都有个输入缓冲区，而在你多次输出间隔符，主要是回车的时候，很容易发生缓冲区数据的错误，所以，为了避免一些不必要的情况，需要每次输入完之后，自己处理一下缓冲区，思想就是这样，scanf有scanf的处理方法，cin有cin的处理方法。 我一般参考这个： #if 0     // safty method to absorb scanf buffer     int i,c;     while (1)     {         printf("input:");         if(scanf("%d",&i)!=EOF)         {             while((c=getchar())!='\n'&&c!= EOF){}         }         printf("out:%d\n",i);         //i here hold the last value     } #endif #if 0     // safty method to absorb cin buffer     int i;     while(1)     {         cout<<"input:";         cin>>i;         cin.clear();         cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );         cout<<"out:"<<i<<endl;         //i here hold the last value     } #endif   这个只能实现多个输入吧，还要有严格的格式控制，第一串数字占五列，然后空一格，第二个数字占两列，并且向右靠齐

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:#include <stdio.h> struct D {     double f;     int n; } d[4]; int i,j; int main() {     for (i=0;i<4;i++) {         while (1) {             printf("\nPlease input %d #.# #:",i+1);             fflush(stdout);             rewind(stdin);             if (3==scanf("%d%lf%d",&j,&(d[i].f),&(d[i].n))) {                 if (j==i+1) break;             }         }     }     return 0; }   主要有严格的格式控制，第一串数字占五列，然后空一格，第二个数字占两列，并且向右靠齐