第一次错误:想利用模块函数返回值来达到计算各字符串长度问题。。
结果。。。爆红,心痛。。。
错误代码如下:
很多细节没有完善。。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define size 100
int compare(char *s, char *T1, char *T2){
int i=0,j=0,k=0;
while(s[i]!='\0'){
i++;
}
while(T1[j]!='\0'){
j++;
}
while(T2[k]!='\0'){
k++;
}
if(j>i || j==0){
printf("s字符串中无T1,替换失败哟,可以重新输入T1呢,亲~\n");
return 0;
}
else{
if(k>j){
printf("\n---若可S中匹配到T1,则需要将T1后面的数组地址根据K的大小往后移--\n");
}
else if(k==j){
printf("----So easy!直接覆盖T1,大快人心---\n");
}
else{
printf("---若可S中匹配到T1,则需要将T1后面的数组地址根据K的大小往前移--\n");
}
printf("可继续操作下一关卡哟~\n");
printf("(线索)T1长度为(不包括'\0'):%d",j);
return j;
}
}
int key_T2(char *T2){
int k=0;
while(T2[k]!='\0')
k++;
return k;
}
int key_S(char *s){
int i=0;
while(s[i]!='\0'){
i++;
}
return i;
}
char* replace_str(char *s, char *T1, char *T2,int keyT1,int keyT2,int keyS){
int i=0,j=0,k=0,back=0,forward=0,lens=keyS,t;
while(s[i]!='\0'){
if(s[i]==T1[j]){
i++;
j++;
}
if(j==keyT1){
// count++;
t=i-keyT1;
j=0;
for(; keyT1==keyT2 && T2[k]!='\0';){
s[t]=T2[k];
t++;
k++;
}
if(keyT1>keyT2){
forward=keyT1-keyT2;
for(k=0;T2[k]!='\0';k++){//t=i-keyT1,
s[t]=T2[k];
t++;
k++;
}
for(;s[t]!='\0';t++)
s[t]=s[t+forward];
}
if(keyT1<keyT2){
back=keyT2-keyT1;
for(;lens>=i;lens--){
s[lens-1+back]=s[lens-1];
if(lens-1+back>=size-1){
printf("--替换失败...可重新开始哟~");
break;
}
}
for(t=i-keyT1,k=0;T2[k]!='\0';k++){
s[t]=T2[k];
t++;
k++;
}
}
}
i++;
}
return s;
}
int main(){
char s[size],T1[size],T2[size];
int keyT1=0,keyT2,keyS;
gets(s);
gets(T1);
gets(T2);
if(compare(s,T1)){
keyT1=(int)compare;
keyT2=(int)key_T2;
keyS=(int)key_S;
printf("\n以下关卡为:终极BOSS");
replace_str(s,T1,T2,keyT1,keyT2,keyS);
printf("\n闯关成功,you are ACE, man!");
}
return 0;
}
后来,不断地完善。终于成功了。。。
直接在main函数中计算各字符串的长度。
正确代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define size 100
char* replace_str(char *s, char *T1, char *T2,int keyT1,int keyT2,int keyS){
int i=0,j=0,k=0,back=0,forward=0,lens=keyS,t,eq,count=0;
while(s[i]!='\0'){
for(j=0;s[i]==T1[j];){
i++;
j++;
}
if(j==keyT1){
count++;
t=i-keyT1;
j=0;
for(; keyT1==keyT2 && T2[k]!='\0';){
s[t]=T2[k];
t++;
k++;
}
if(keyT1>keyT2){
forward=keyT1-keyT2;
for(k=0;T2[k]!='\0';){//t=i-keyT1,
s[t]=T2[k];
t++;
k++;
}
for(;s[t]!='\0';t++)
s[t]=s[t+forward];
}
if(keyT1<keyT2){
back=keyT2-keyT1;
for(;lens>=i;lens--){
s[lens-1+back]=s[lens-1];
if(lens-1+back>=size-1){
printf("--替换失败...可重新开始哟~");
break;
}
}
for(t=i-keyT1,k=0;T2[k]!='\0';){
s[t]=T2[k];
t++;
k++;
}
}
}
else
i++;
}
if(count==0){
printf("\n---S中未匹配到T1,可重新再来哟~\n");
}
return s;
}
int main(){
char s[size],T1[size],T2[size];
int e;
for(e=0;s[e]!='\0';e++)
s[e]=0;
int keyT1=0,keyT2,keyS;
int i=0,j=0,k=0;
gets(s);
gets(T1);
gets(T2);
printf("\n-----此乃华丽的分割线------\n");
while(s[i]!='\0'){
i++;
}
keyS=i;
while(T1[j]!='\0'){
j++;
}
keyT1=j;
while(T2[k]!='\0'){
k++;
}
keyT2=k;
if(j<i && j!=0){
if(k>j){
printf("\n---若可S中匹配到T1,则需要将T1后面的数组地址根据K的大小往后移--\n");
}
else if(k==j){
printf("----So easy!直接覆盖T1,大快人心---\n");
}
else{
printf("---若可S中匹配到T1,则需要将T1后面的数组地址根据K的大小往前移--\n");
}
printf("\n---以下关卡为:终极BOSS--\n");
replace_str(s,T1,T2,keyT1,keyT2,keyS);
printf("\n---outcome=%s\n",s);
printf("\n---闯关结束,you are ACE, man!--");
}
else
printf("S中匹配不到T1哟~可再来一次");
return 0;
}
值得纪念得百行代码,开森~