模拟strrev函数,疯狂输出

问题描述

我应该用我的题词来模拟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;
}