洛谷P1957 关于memset ssprintf sscanf的初级理解

洛谷P1957做题笔记

代码如下:

#include<stdio.h>
#include<string.h>
#define N 10001 
char s[N],s1[N],s2[N];
char ch,t;
int x,y;
int len,len1,len2;
void sort (char t)
{
	if(t=='a')
	{
		int sum=x+y;
		sprintf(s,"%d+%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
		if(t=='b')
	{
		int sum=x-y;
		sprintf(s,"%d-%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
		if(t=='c')
	{
		int sum=x*y;
		sprintf(s,"%d*%d=%d",x,y,sum);
		printf("%s",s);
		len=strlen(s);
		printf("\n");
		printf("%d\n",len);
	}
	memset(s1,0,strlen(s1));
		memset(s2,0,strlen(s2));
		memset(s,0,strlen(s));
	
}
int main()
{
	int n;
	scanf("%d",&n);
//	printf("%d\n",n);
	for(int i=0;i<n;i++)
	{
	
		scanf(" ");
		scanf("%c",&ch);
		if('a'<=ch&&ch<='c')
		{
			scanf(" ");
			t=ch;
//			printf("t=%c\n",t);
			scanf("%d%d",&x,&y);
		}
		else 
		{
			int v=1,b=0;
			scanf(" ");
			s1[0]=ch;
		//	printf("s1[0]=%c\n",s1[0]);
			while(1)
			{
				scanf("%c",&ch);
				if(ch==' ')
				break; 
				else
				{
				s1[v]=ch;
			    //printf("s[v]=%c v=%d\n",s1[v],v);
				v++;
			    } 
			}
			gets(s2);
			len1=strlen(s1);
			len2=strlen(s2);
			//printf("len1=%d len2=%d\n",len1,len2);
			sscanf(s1,"%d",&x);
			sscanf(s2,"%d",&y);
		}
		sort(t);	
	
	}
	return 0;
} 

关于此题的几点总结:
1.1 对memset()函数的使用的理解
众所周知,memset()的主要用法为将数组清零。但如何清零是作为新手的第一个问题。
关于这个函数我试过三种方式,只有一种达到目的。
1.1.1

memste(s1,'0',sizeof(s1));

这样做会使s1的所有元素变为’0‘。如果用strlen(s1)去查看字符串长度的话,可以发现长度为100(定义的长度),所以这样做的目的是将数组内的所有开辟的内存存入’0‘。
1.1.2

memset(s1,'0',strlen(s1));

这样做也是代换的一种,和上一种方式不同的点是这个只会将输入的字符替换为’0‘。
1.1.3

memset(s1,0,strlen(s1));

这样做和前两种不一样,这样写才能做到真正意思上的“重启”。
1.2 对sscanf()的初级使用
1.2.1
截取片段文章:
(1)sscanf("zhoue3456 ", “%4s”, str); //取指定长度的字符串
printf(“str=%s\n”, str); //str=“zhou”;
这里我先学习sscanf()的最初级用法
可以看出,sscanf()函数的主要用法是对字符串的截取和强制转换
但要注意

int n;
char s[100];
scanf("%d",&n);
sscanf("n","%s",s);

*这样做是无效的,输出的s为n。 *
参考Citronnelle2的文章:

定义函数 int sscanf (const char *str,const char * format,…);
函数说明
sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。
返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 返回0表示失败 否则,表示正确格式化数据的个数

由此定义可知,前面的参数一定要是一个char类型的参数,int类型的不可以作为参数输入。
这个char类型的参数如果是数组,就直接写成这样

sscanf(s,"%d",&a);

如果要将字符型数组转换成int类型存储到新的参数中去,一定要再参数前加&
这里引发一个思考,如果输入的字符不是数字的话,转化出的东西是什么呢?
于是我简单的写了一个测试案例:

#include<stdio.h>
#include<string.h>
int main()
{
	char s[100];
	gets(s);
	int a;
	sscanf(s,"%d",&a);
	printf("a=%d\n",a); 
	return 0;
 } 

输入:sdasdad
输出:a=0
这里在写一点个人理解(蒟蒻理解):sscanf函数和scanf函数类似,都是用于输入,只不过scanf函数是从人脑到电脑, 而sscanf函数是将电脑到电脑,所以sscanf函数后面的格式可以这样想:
sscanf(电脑的一个已知参数输入源,“转变成输出格式”,电脑的另一个已知参数做输出源)

总结:sscanf()的用法主要是将char 类型的数组转变为int 类型输入到一个参数中去,这样做可以在一些题上有大用。
1.3 对sprintf()函数的使用

格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代
itoa。

如: //把整数123 打印成一个字符串保存在s 中。 sprintf(s, “%d”, 123); //产生"123"
可以指定宽度,不足的左边补空格: sprintf(s, “%8d%8d”, 123, 4567); //产生:" 123 4567"
当然也可以左对齐: sprintf(s, “%-8d%8d”, 123, 4567); //产生:“123 4567”

说简单点就是将整数类型转变为char类型存储到数组中去,这样做的主要好处就是便于计算长度,如此题中的计算a+b=c的长度。
ssprintf函数和sscanf函数作用相反,可以理解成把int类型转变为char类型。
但是,要注意一点

sprintf(s,"%d+%d=%d\n",a,b,c);

如果在第二栏里面输入了一个’\n‘,那么你用strlen()计算出来的长度会包括一个’\n‘。所以如果你要实现换行,最好令起一行输入

printf("\n");
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值