问题描述
我应该用我的题词来模拟strrev()函数的操作。但是,我不明白为什么我会有一系列特殊字符,直到完全停止程序后,这些特殊字符才对输出没有意义。我还尝试查看问题是否出在带有注释行的索引“ i”中,但没关系。可能是什么问题呢?谢谢!
void strrev_new(char *s_to_rev) {
int i = 0;
int length = 0;
length = strlen(s_to_rev);
for (i = 0; i < length; i++) {
s_to_rev[length - i] = s_to_rev[i];
// printf("%d ----- %d\n",(length-i),i);
}
}
解决方法
由于strlen()
返回了字符串的长度(例如,hello
为5),所以出现了错位的错误,但是字符串中的最后一个索引为4(从0开始计数)
尝试
s_to_rev[length - 1 - i] = s_to_rev[i];
,
您的代码有两个问题。第一个由@AKX出色地发现的地方是,您从str[length]
字符而不是str[length-1]
开始写(在C数组索引中从0开始)。
第二个问题是由于您试图在原地反转字符串 而没有使用辅助数组的结果。
有了循环
for (i = 0; i < length; i++) {
s_to_rev[length - i] = s_to_rev[i];
}
您正确开始更新数组的最后一个元素。但是,一旦到达字符串的一半,s_to_rev[i]
处的字符就不再是原始字符,因为您之前已对其进行了更新!
请尝试遍历字符串的一半并交换字符(只需使用临时char
变量):
for (i = 0; i < length/2; i++) {
char tmp = s_to_rev[length - i -1],s_to_rev[length - i -1] = s_to_rev[i];
s_to_rev[i] = tmp;
}