洛谷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");