2 u012978594 u012978594 于 2013.12.10 12:37 提问

关于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个回答

qiaolin19890323
qiaolin19890323   2013.12.10 15:13
已采纳

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

qiaolin19890323
qiaolin19890323 对了,你采纳一下我的评论吧。这样我也能得个分哦,呵呵谢谢
4 年多之前 回复
qiaolin19890323
qiaolin19890323 嗯,细心些。
4 年多之前 回复
u012978594
u012978594 已经改正了,vs竟然没有报错= =,想了那么多却只错了个符号。thanks
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
scanf与gets函数混用
利用scanf函数从键盘接收一字符(或整数)时,它只读入字符(或整数)本身,而把字符(或整数)后的回车符留在输入缓冲区内;gets函数从标准的输入读取,如果使用gets函数给字符数组输入字符串时,字符数组不能指定长度,因为,只要字符数组的长度小于gets函数读取的行缓存的大小,即使你输入的字符数大于你所规定的字符数组的长度,gets函数也会接收所输入的全部字符,造成字符数组越界。因此,gets是一
浅谈scanf,getchar,gets分别输入字符串有什么区别
其实用scanf("%s",);和gets();本质上没有什么区别,都是将字符数据输入到制定的内存单元中。 假设定义有字符数组(C语言把字符串按字符数组处理)str[30],那么我们向里面输入字符就可以为: scanf("%s",str); gets(str); 他们都可以这样输出: printf("%s",str); 或者puts(str); 注意: (1)使用sc
gets与scanf关于字符串输入(特别是对换行符处理)的一点小解惑
如果scanf只输入一个字符串,gets也只是输入一个字符串,那会有什么区别吗?他们对空格的处理是怎样的呢?1.先来gets的介绍先吧 gets  【1】函数:gets(字符指针)  【2】头文件:stdio.h(c中),c++不需包含此头文件  【3】原型:char*gets(char*buffer);  【4】功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放
缓存区 及scanf() getchar() gets()的区别
首先,我先说一下对缓存区的理解 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储 空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是 输出设备,分为输入缓冲区和输出缓冲区。 我这边以一个例子说下缓存区是如何进行工 #include int main()
关于字符串gets()和scanf("%s")和getchar()的用法
分析如下::::: 对于字符串的输入,一直是很怕,在写代码的过程中都是避免使用,特别是当需要输入2个字符串的时候,经常出现如下的情况: #include"stdio.h" main() { int k; char p[10],o[10]; scanf("%d",&k); gets(p); gets(o); printf("%s\n%s",p,o);//输出两个字符串
字符串输入函数gets( ) fgets( ) scanf( )
<br />C库提供了三个读取字符串的函数:gets( )  fgets( )  scanf( )。<br />gets()---get string 从系统的标准输入设备(通常是键盘)获得一个字符串。因为字符串没有预定的长度,所以gets()需要知道输入何时结束。解决办法是在读字符串直到遇到一个换行符(/n),按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,在这些字符后加一个空字符(/0)。它会丢弃换行符。<br />定义函数   char *gets(char *s)<br />返
gets与scanf如何判断读取文件结束
gets与scanf如何判断读取文件结束 (1) void * =====NULL (2)int =======EOF=======0 当出错或到文件末尾时: scanf() 返回int,故与EOF匹配 gets() 返回char * ,故与NULL匹配 两个例子: (1)  #include void main() { char a[20];
scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
--------------------------------------------------- | 问题描述一:(分析scanf()和gets()读取字符) | ---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时
pat:1018 scanf读取字符;段错误
输入格式: 10 C J J B C B B B B C C C C B J B B C J J 翻译为输入流为: 10\nC J\nJ B\n........ while(scanf("%d", &n)); scanf("%c %c", &a, &b); 读入10后,指针指向了\n,在使用%c时,是不会跳过空格,制表符,换行符的。所以读取的结果是a = '\n';这就
scanf()、getchar()、gets()、cin之间的区别
问题描述一:(分析scanf()和getchar()读取字符)       scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1:          或者是:     #include     int main()     {