对于http://blog.csdn.net/ganggexiongqi/article/details/8096440中的程序错误:
#include <stdio.h>
#include <string.h>
#define MAX 1024
int restr(char* const str)
{
int i;
if (str == NULL) return 0;
for (i = 0; i < strlen(str) / 2; i ++) {
/* 其实是这里的原地交换出了问题 ###1 */
str[i] ^= str[strlen(str) - i -1];
str[strlen(str) - i -1] ^= str[i];
str[i] ^= str[strlen(str) - i -1];
}
return 0;
}
int main(void)
{
char str[MAX];
printf("input the str:\n");
gets(str);
restr(str);
printf("after the processed:\n");
printf("%s\n",str);
return 0;
}
错误出现在###1处。
比如分析输入串为"AAA"的情况。
i = 0 时:
str[i] ^= str[strlen(str) - i -1];
// str[0] ^= str[2],这一步执行完毕时,str[0] = '\0'
str[strlen(str) - i -1] ^= str[i];
//str[0 - 0 - 1] ^= str[0], str[-1] 处的值被取反。
str[i] ^= str[strlen(str) - i -1];
// str[0] ^= str[0 - 0 - 1], str[0] 被赋值为str[-1]处未取反时的值。一般str[-1]处的值为'\0',
所以从restr()中返回时,字符串长度变为了0,所以在输入串为“AAA”时,输出为空。但是,当输入串的所有对称位置上的字符串不相等时,输出结果还是正确的。
修正后的程序:
int len = strlen(str);
for (i = 0; i < len / 2; i ++) {
/* 其实是这里的原地交换出了问题 ###1 */
str[i] ^= str[len - i -1];
str[len - i -1] ^= str[i];
str[i] ^= str[len - i -1];
}