起因还是得从一道题开始[洛谷P1320 压缩技术(续集版)]
eg:输入,输出7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
0001000
0001000
0001111
0001000
0001000
0001000
1111111
这道题的第一个难点是字符串输入时回车是默认结束的,而且因为无法得知循环次数,无法用getchar()吸收回车。
所以我们要思考如何得知循环次数并在回车后能接着输入字符串
这就要用到#include<string.h>库中的两个函数
strlen()和strcat()函数
- strlen函数能够获取到数组的实际大小,因此我们可以先输入一组字符串,用strlen函数来获得正方形的边长,即:
char a[100000],c[1000];//a是用来存放字符串的数组,c是用来输入的数组
scanf("%s",c);//输入第一组字符串
int h=strlen(c);//用h存储长度
此时我们已经获得了正方形的边长,接下来就是输入剩下h-1个字符串了,这时为了方便接下来的输入和计算,我们引入strcat函数
- strcat()函数能够将两个数组连接到一起,strcat(a,c)就是将c数组接到a数组后面
eg.
#include<stdio.h>
#include<string.h>
int main()
{
char a[100],c[100];
scanf("%s",&a);输入aaa
scanf("%s",&c);输入bbb
strcat(a,c);将c数组中的bbb接到a数组aaa中的后面
printf("%s",a);此时a数组存储aaabbb
return 0;
}
因此我们可以利用strcat来进行输入,代码如下:
int i,j,l=0;
for(i=0;i<h-1;i++)
{
scanf("%s",c);
strcat(a,c);
}
接下来就是0和1的判断了,这是比较容易想到的,这里直接贴代码:
char k='0';
for(j=0;j<=strlen(a);j++)
{
if(a[j]==k)
l++;
else
{
k=a[j];
printf("%d ",l);
l=1;
}
}
然后完整代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000],c[1000];
scanf("%s",c);
int i,j,l=0;
int h=strlen(c);
char k='0';
strcat(a,c);
for(i=0;i<h-1;i++)
{
scanf("%s",c);
strcat(a,c);
}
printf("%d ",h);
for(j=0;j<=strlen(a);j++)
{
if(a[j]==k)
l++;
else
{
k=a[j];
printf("%d ",l);
l=1;
}
}
return 0;
}