Lost_Next_Door 2013-12-10 04:37 采纳率: 100%
浏览 2324
已采纳

关于scanf和gets读入字符串、整数的请教

/*
forward x  向前走x米。 
back x 先转向后,再走x米。 
left x 先转向左,再走x米。
right x 先转向右,再走x米。 
up x 先面向上,再走x米。 
down x 先面向下,再走x米。
+x=0 -x=3
+y=1 -y=4
+z=2 -z=5
前面 +x
上面 +z
右面 +y
*/

#include
#include
#define L 12 //最长:"forward 10000"
/*初始位置 x=0 y=1 z=2 面朝+x=0*/
int x=0,y=1,z=2,change,p=0,up=2,down=5,left=4,right=1,behind=3,mid;
char str[L+1];

/*判断方向改变*/
void change_p(char str[],int*nn )//输入字符串和地址&p
{
switch(str[0])
{
case 'f':break;
case 'b':mid=*nn;*nn=behind;behind=mid;mid=left;left=right;right=mid;break;
case 'l':mid=*nn;*nn=left;left=behind;behind=right;right=mid;break;
case 'r':mid=*nn;*nn=right;right=behind;behind=left;left=mid;break;
case 'u':mid=*nn;*nn=up;up=behind;behind=down;down=mid;break;
case 'd':mid=*nn;*nn=down;down=behind;behind=up;up=mid;break;
default:printf_s("ERROR str\n");break;
}
 }
void xyz(char str[],int pp,int*xx,int*yy,int*zz)
{
int sum=0,ii=1;
for(int i=12;i>=0;i--)
    if(str[i]>=48&&str[i]<=57)
    {
        sum+=(str[i]-48)*ii;
        ii*=10;
    }
switch(pp)
{
case 0:*xx+=sum;break;
case 1:*yy+=sum;break;
case 2:*zz+=sum;break;
case 3:*xx-=sum;break;
case 4:*yy-=sum;break;
case 5:*zz-=sum;break;
default:printf_s("ERROR number\n");break;
}
}
int main()
{
int m,n;
scanf_s("%d",&m);getchar();
for(;m>0;m--)
{
    scanf_s("%d",&n);fflush(stdin);
    for(;n>0;n--)
    {
        gets_s(str);
        change_p(str,&p);
        xyz(str,p,&x,&y,&z);
        fflush(stdin);
    }

    printf_s("%d %d %d %d\n",x,y,z,p);
}
system("pause");
return 0;
}

题目来自于BOJ宇航员问题:http://poj.org/problem?id=1835

我知道scanf函数读入后,会在缓存区域剩下些东西。
当我尝试使用getchar()取出多余内容时总是得不到想要的结果。
我想用gets读入字符串,用自定义函数来从中取出整数使用。

scanf_s("%d",&n);
fflush(stdin);
for(;n>0;n--)
{
    gets_s(str);
    change_p(str,&p);
    xyz(str,p,&x,&y,&z);
    fflush(stdin);
}

输入1//共有几组数据
输入6//读入几次字符串

left 10
right 11
up 12
down 13
forward 14
back 15
数据输入结束

在实际输入时,常常输入完1、6后程序得出结果终止运行。从输出数据来看,有几次可以读入字符串,但是均为'\0'。更多时候无法运行至gets函数就出结果。

最后我还尝试了使用fflush函数清除缓存区域,任不得要领。
求指教。

  • 写回答

1条回答 默认 最新

  • join888888 2013-12-10 07:13
    关注

    scanf_s("&d",&n);这句话,确定对,不是%号?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示