文章目录
目录
前言
俺就是个小白,俺最近在acwing用C语言写字符串的题,写的多了纪念一下。(前面代码发的时候排版没了,但我懒得重新排版了)
一、替换字符
题解:
int main()
{
char a[31];
int i=0;
gets(a);
char b;
scanf(“%c”,&b);
while(a[i]>0)
{
if(a[i]==b)
a[i]=’#’;
i++;
}
puts(a);
return 0;
}
二、字符串加空格
题解:
int main()
{
char a[101];
int i=0;
gets(a);
while(a[i]>0)
{
printf(“%c “,a[i]);
i++;
}
return 0;
}
注意
不能使用scanf(“%s”,&a)进行输入,因为其读到空格会停止。
而gets()函数则是读取到空字符或者换行符停止
三、循环相克令
题解:
int main()
{
int n;
char a[15],b[15];
scanf(“%d”,&n);
for(int i=0;i<n;i++)
{
scanf(“%s %s”,&a,&b);
if(strcmp(a,b)==0)printf(“Tie”);
if(strcmp(a,”Hunter”)==0&&strcmp(“Bear”,b)==0)printf(“Player2”);
if(strcmp(a,”Hunter”)==0&&strcmp(“Gun”,b)==0)printf(“Player1”);
if(strcmp(a,”Bear”)==0&&strcmp(“Hunter”,b)==0)printf(“Player1”);
if(strcmp(a,”Bear”)==0&&strcmp(“Gun”,b)==0)printf(“Player2”);
if(strcmp(a,”Gun”)==0&&strcmp(“Hunter”,b)==0)printf(“Player2”);
if(strcmp(a,”Gun”)==0&&strcmp(“Bear”,b)==0)printf(“Player1”);
printf(“\n”);
}
return 0;
}
注意:
strcmp(str1,str2)函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。
返回依据两者每个字符ASCII码判断大小,遇到不同或者空字符停止
这个函数只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
比较示例如下
1.”A”<”B”
2.”A”<”AB”
3.”Apple”<”Banana”
4.”A”<”a”
5.”compare”<”computer”
四、字符串插入
题解:
int main()
{
char str[11],substr[4];
while(~scanf(“%s %s”,&str,&substr))
{
int i=0,t=0;
while(str[i]>0)
{
if(str[i]>str[t])
t=i;
i;
}
for(int j=0;j<=t;j)
printf(“%c”,str[j]);
i=0;
while(substr[i]>0)
{
printf(“%c”,substr[i]);
i;
}
//puts(substr)不能用 ,因为会多输出一个回车
t;
while(str[t]>0)
{
printf(“%c”,str[t]);
t++;
}
printf(“\n”);
}
return 0;
}
注意
while(~scanf(“%d %d”,&a,&b))是C语言的连续输入
作用相同的还有while(scanf(“%d %d”, &a, &b)!=EOF)
用哪个看个人习惯
五、只出现一次的字符
题解:
int main()
{
char a[100001];
int t=0,i=0,y=0;
gets(a);
while(a[t]>0)
{
y=0;
i=0;
while(a[i]>0)
{
if(a[i]==a[t]&&i!=t)
goto mao;
i;
}
printf(“%c”,a[t]);
y=1;
break;
mao:
t;
}
if(y==0)
printf(“no”);
return 0;
}
另外
还有两种思路(其他题解里看的)
一种是前后都进行查找,如果同一个字母前后查找位置一样就是只出现一次
另一种是开一个数组给每个字母都整一个位置然后判断
六、字符串中的数字个数
题解:
int main()
{
char a[101];
int n=0,i=0;
gets(a);
while(a[i]>0)
{
if(a[i]>=‘0’&&a[i]<=‘9’)
n+=1;
i++;
}
printf(“%d”,n);
return 0;
}
七、字符串长度
题解:
int main()
{
char a[101];
gets(a);
int n=strlen(a);
printf(“%d”,n);
return 0;
}
八、字符串匹配
题解:
int main()
{
char a[100],b[100];
int s=0,t=0;
double q,k;
scanf("%lf\n",&k);
gets(a);
scanf("\n");
gets(b);
while(a[s]>0)
{
if(a[s]==b[s])
t++;
s++;
}
q=(t*1.0f)/(s*1.0f);
if(q<k)
printf("no");
else
printf("yes");
return 0;
}
注意
scanf("%lf\n",&k);一定要加换行符,不然gets会把换行符读进去(我看了好久才看出来bug,还是写得少)
q=(t*1.0f)/(s*1.0f);防止混合运算出现截断问题
九、忽略大小写比较字符串大小
链接:768. 忽略大小写比较字符串大小 - AcWing题库
题解:
int main()
{
char a[81],b[81];
gets(a);
scanf("\n");
gets(b);
int i=0;
while(a[i]>0&&b[i]>0)
{
if(a[i]>='A'&&a[i]<='Z')
a[i]+=32;
if(b[i]>='A'&&b[i]<='Z')
b[i]+=32;
i++;
}
int r=strcmp(a,b);
if(r>0)
printf(">");
else if(r<0)
printf("<");
else
printf("=");
return 0;
}
十、输出字符串
题解:
#include<stdio.h>
#include<string.h>
int main()
{
char a[101]="",b[102]="";
gets(a);
int i=0;
while(a[i]>0)
{
if(a[i+1]==0)
b[i]=a[i]+a[0];
else b[i]=a[i]+a[i+1];
i++;
}
puts(b);
return 0;
}
注意
字符数组a[]和b[]一定要赋初值为空字符,否则的话在输出答案后还会输出乱码
十一、信息加密
题解:
#include<stdio.h>
#include<string.h>
void sec(char a[])
{
int i=0;
while(a[i]>0)
{
if(a[i]>='a'&&a[i]<'z')
a[i]+=1;
else if(a[i]=='z')
a[i]='a';
if(a[i]>='A'&&a[i]<'Z')
a[i]+=1;
else if(a[i]=='Z')
a[i]='A';
i++;
}
}
int main()
{
char a[101];
gets(a);
sec(a);
puts(a);
return 0;
}
十二、去掉多余的空格
题解:
int main()
{
char a[201];
gets(a);
int i=0;
while(a[i]>0)
{
if(a[i]!=' ')
{
if(a[i+1]==' ')
printf("%c ",a[i]);
else printf("%c",a[i]);
}
i++;
}
return 0;
}
十三、单词替换
题解:
#include<stdio.h>
#include<string.h>
void replace(char s[],char a[],char b[])
{
int count=0,done=0,gap=0;
char temp[105]="";
for(int i=0;i<strlen(s);i+=gap)
{
if(s[i]==a[0])
{
if(s[i-1]==' '||i==0) //题目要求是一个单词,所以要判断空格
{
done=0;
int j=i,k=0;
while(s[j]!=' '&&s[j]>0)
{
if(s[j]!=a[k])
{
done=1;
gap=k;
break;
}
k++;
j++;
}
if(done==0&&k==strlen(a))
//限制k防止出现某个单词恰好等于用来替换的单词的前面一部分导致错误替换
{
count++;
int p=0;
for(int t=j;s[t]>0;p++,t++) //储存后面的句子
temp[p]=s[t];
for(int t=0;b[t]>0;t++,i++) //替换单词
s[i]=b[t];
int t=i;
for(int q=0;q<p;q++,t++) //讲后面的句子拼接上去
s[t]=temp[q];
s[t]='\0'; //使字符串结束,防止后面有剩余的部分
}
else
{
gap=1;
continue;
}
}else gap=1;
}else gap=1;
}
if(count==0) printf("no");
}
int main()
{
char s[150]="",a[101]="",b[101]="";
gets(s);
gets(a);
gets(b);
replace(s,a,b);
puts(s);
return 0;
}
吐槽:
我真是服了,C语言连字符串替换函数都没有,怪不得好几个字符的题我一个C语言的题解都没看到,写了我五个小时,主要不知道哪里有bug(悲)
另外申明一下,C语言有复制、比较和拼接函数,我写的时候忘了这回事了,就全用代码写了,其实能稍微简单一点的
十四、字符串中最长的连续出现的字符
链接:771. 字符串中最长的连续出现的字符 - AcWing题库
题解:
#include<stdio.h>
#include<string.h>
void suibian(char a[])
{
int max=0,t=0;
char max1;
for(int i=0;i<strlen(a);i+=t) //i+=t能减少循环次数,提升速度
{
for(int j=i;j<strlen(a);j++)
{
if(a[j]!=a[i]) //数有几个字符
{
t=j-i;
break;
}
else if(j==strlen(a)-1) //否则会在如字符串为AAAAA的情况下少使输出少1
{
t=j-i+1;
break;
}
}
if(t>max) //找出最大
{
max1=a[i];
max=t;
}
}
printf("%c %d\n",max1,max);
}
int main()
{
int n;
char a[205]="";
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
gets(a);
suibian(a);
}
return 0;
}
十五、最长单词
题解:
#include<stdio.h>
#include<string.h>
void zuichang(char a[])
{
int i=0,max=0;
char max1[505]="";
while(i<strlen(a))
{
int j=i;
while(a[j]!=' '&&a[j]!='.')
{
j++;
}
if(j-i>max)
{
max=j-i;
for(int k=i,p=0;k<j;k++,p++)
{
max1[p]=a[k];
}
}
i=j+1;
}
puts(max1);
}
int main()
{
int n;
char a[505]="";
scanf("%d\n",&n);
gets(a);
zuichang(a);
return 0;
}
十六、倒排单词
题解:
#include<stdio.h>
#include<string.h>
void daocha()
{
char a[101];
while(~scanf(" %s",&a))
{
daocha();
printf("%s ",&a);
}
}
int main ()
{
daocha();
return 0;
}
吐槽:写点简单的,省的被吐槽只会写粗暴的
最后
我的acwing账号是:个人空间 - AcWing