程序的隐患有两个。
一是倒置处理的判定条件:j<=k。实际上按你的方法,倒序的工作只需要进行一半的循环就可以完成了,因此可以将判定条件改为:j < k / 2 和 j < k - (tp2 - tp1 + 1) / 2 。
二是flag==1的时候交换字符位置的计算公式:*(str+j) = *(str+k-j); 这里k一直是tp2,而j是从tp1开始循环的,所以str+k-j的结果并不是需要交换的字符本身,而是从str的第1个字母到第(k-j+1)个字母之间。这个也很好改,加一个tp1即可:*(str+j) = *(str+k+tp1-j); 。
改后的程序如下:
=====================================================================
int strABC(char *str) {
int i,j,k;
int tp1=0, tp2; //记录字符串中空格的位置
int flag=0; //判断是否为字符串中第一小段字符串
int isSuss; //是否转换成功
char temp;
if(str==NULL) {
isSuss = 0;
return isSuss;
}
for(i=0; ;i++) {
if((*(str+i)==' ')||(*(str+i)=='\0')) {
if(flag==0) {
tp1=0; //小段字符串从tp1位置开始
tp2=i-1; //小段字符串到tp2位置结束
//for(j=tp1, k=tp2; j<=k; j++) { //倒置处理,此处的判定条件有问题
for(j=tp1, k=tp2; j
*(str+j) = *(str+k-j);
*(str+k-j) = temp;
}
flag=1;
} else {
tp1=tp2+2;
tp2=i-1;
//for(j=tp1, k=tp2; j<=k; j++) { //倒置处理,此处的判定条件有问题
for(j=tp1, k=tp2; j
//*(str+j) = *(str+k-j); //此处的计算公式有问题
*(str+j) = *(str+k+tp1-j);
*(str+k+tp1-j) = temp;
}
}
if(*(str+i)=='\0') {
isSuss=1;
break;
}
}
}
return isSuss;
}
你的程序的两个for循环的判断条件和倒置公式有问题,我改了下,现在是几个字符都可以进行倒置
int strABC(char *str) {
int i,j,k;
int tp1=0, tp2; //记录字符串中空格的位置
int flag=0; //判断是否为字符串中第一小段字符串
int isSuss; //是否转换成功
char temp;
if(str==NULL) {
isSuss = 0;
return isSuss;
}
for(i=0; ;i++) {
if((*(str+i)==' ')||(*(str+i)=='\0')) {
if(flag==0) {
tp1=0; //小段字符串从tp1位置开始
tp2=i-1; //小段字符串到tp2位置结束
for(j=tp1, k=tp2; j
*(str+j) = *(str+k);
*(str+k) = temp;
}
flag=1;
} else {
tp1=tp2+2;
tp2=i-1;
for(j=tp1, k=tp2; j
*(str+j) = *(str+k);
*(str+k) = temp;
}
}
if(*(str+i)=='\0') {
isSuss=1;
break;
}
}
}
return isSuss;
}