user-0 提问: 【跪求大神指导一下（在线等）】运行结果达不到预期效果

回复:
user: user-1
content: 引用 10 楼 zl392321162 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 楼主不会吗？ 我不喜欢不听话的孩纸！    已经解决咯，不是那个问题，是我结构体定义有问题。。[/quote] 你scanf("%s",...)；不限制输入长度，早晚还是会出问题！

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 楼主不会吗？ 我不喜欢不听话的孩纸！  谢谢咯。。

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 楼主不会吗？ 我不喜欢不听话的孩纸！    已经解决咯，不是那个问题，是我结构体定义有问题。。

user: user-3
content: 应该是scanf的问题，你在每个scanf后面加个情况缓冲区试试

user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 楼主不会吗？ 我不喜欢不听话的孩纸！

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  谢谢老师指点，我基础不是很扎实。。。哎。。。我在调试调试，有问题的话我还会来麻烦老师滴

user: user-4
content: 需要自己手动输入日期和来访时间，我觉的这个应该由系统直接设定的，不需要手动输入

user: user-4
content: 我电脑是linux系统的，帮不了你了。。。

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。这是复制粘贴的吗？我也要这样

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 老师，能帮我再看一下吗？我调试完还是没有找到原因。。。明天就要答辩了。。。很着急。。

user: user-0
content: /*******************************查找模块************************************/ void search() {     int i,n,k,w1=1,w2,w3,w4;     struct person p;     system("CLS");     n=load();     do     {         do         {             k=-1;             printf("\n请输入您要查找的被访人姓名:\n");             scanf("%s",p.bv_name);             printf_face();             for(i=0;i<n;i++)                 if(strcmp(p.bv_name,per[i].bv_name)==0)                 {                     k=i;                     printf_one(k);                 }                 if(k==-1)                 {                     printf("\n您所要查找的信息不存在,请重新输入!");                     printf("\n要继续查找吗？\n\t1).继续\t2).返回\t[ ]\b\b\b");                         scanf("%d",&w1);                 }         }while(k==-1 && w1!=2);         w4=w3=0;         if(k!=-1)         {             printf("\n还要查看信息吗？\n\t1).再次查找\t2).修改信息\t3).删除\t4).返回主菜单\t[ ]\b\b\b");             scanf("%d",&w2);             switch(w2)             {             case 2:w3=modify_data(k,n);break;             case 3:{                 printf("\n\t1).确定2).返回\t[ ]\b\b\b");                 scanf("%d",&w4);                 if(w4==1)                     per[k].f_num=0;                 break;             }         }             if(w3==1 || w4==1)             {                 save(n);                 printf("\n操作成功");                 printf("\n\t1).再次查找2).返回[]\b\b");                 scanf("%d",&w2);             }             }     }while(w2==1);         menu();     }  /*******************************排序模块（按照被访人的楼号）*********************************/ void order() {     int i,j,k,n;     struct person p;     system("CLS");                //清屏     n=load();                    //获得总记录的个数，并加载记录     for(i=0;i<n-1;i++)     {         k=i;         for(j=i+1;j<n;j++)             if(per[j].f_num>per[k].f_num)    //选择法排序                 k=j;         p=per[i];         per[i]=per[k];         per[k]=p;     }     save(n);     puts("\n\n");     printf_back(); } /**********************************主界面************************************/ void menu(){     int n,w1;     do     {         system("CLS");     puts("\n\t\t\t小型小区来访人员登记管理系统");     puts("\t\t * * * * * * * * * * * * * * * * * * * * * ");     puts("\t\t *\t  1. 基本信息录入\t\t *");     puts("\t\t *\t  2. 添加新信息  \t\t *");     puts("\t\t *\t  3. 根据来访人姓名删除记录\t *");     puts("\t\t *\t  4. 根据来访人姓名修改记录\t *");     puts("\t\t *\t  5. 查看浏览记录信息\t\t *");     puts("\t\t *\t  6. 根据被访人楼号查询记录\t *");     puts("\t\t *\t  7. 按照被访人楼号进行排序\t *");     puts("\t\t *\t  8. 退出管理系统\t\t *");     puts("\t\t * * * * * * * * * * * * * * * * * * * * * ");      /*-------输入选择编号----------*/     printf("\t请输入您的选择(1-8):[ ]\b\b");     scanf("%d",&n);     /*-------判断输入数是否在1-8之间------*/     if(n <= 0 || n > 8)     {         w1=1;         printf("\t对不起，您的选择不在1-8之间，请重新输入!");         getch();     }else         w1=0;     }while(w1==1);      /*----选择编号,利用switch语句-----*/     switch(n)     {         case 1:enter();break;         case 2:add();break;         case 3:modify();break;         case 4:del();break;         case 5:browse();break;         case 6:search();break;         case 7:order();break;         case 8:exit(0);break;     } } /************************************主函数***************************************/ void main() {     menu(); }