迭代地反转C中的字符串

Reversing a string in C iteratively

我正在尝试在 C 中反转字符串,我能够完成此操作但并非没有我不太了解的副作用。这是我反转字符串的代码:

void reverseString(char *toReverse, char *reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    for (i; toReverse[counter] != '[=10=]'; i--) {
        reverse[i] = toReverse[counter];
        counter++;
    }
}

int main(int argc, char *argv[]) {
    char reverse[strlen(argv[1]) + 1];
    reverse[strlen(reverse)] = '[=10=]';
    reverseString(argv[1], reverse);
    printf("The reverse string is '%s'", reverse);
}

当给出一个字符串时,这会正确地反转字符串,但也会添加一些额外的数据,例如:

给定字符串 abc123 返回字符串 321cbaub◄¥u"ñç«

为什么会发生这种情况,我该如何解决?

您应该在 reverse 字符串中提供一个空终止符 [=13=] 以使用 printf%s 格式正确打印您反转的字符串。

void reverseString(char* toReverse, char* reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    for (i; toReverse[counter] != '[=10=]'; i--) {
        reverse[i] = toReverse[counter];
        counter++;
    }
    reverse[counter] = '[=10=]'; //add this
}

此外,有时对于动态分配的东西,最好使用 malloc:

reverse = (char*)malloc(i + 1);

变成这样:

void reverseString(char* toReverse, char* reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    reverse = (char*)malloc(i + 1);
    for (i; toReverse[counter] != '[=12=]'; i--) {
        reverse[i] = toReverse[counter];
        counter++;
    }
    reverse[counter] = '[=12=]'; //add this
}

您的字符串不是以 null 结尾的,这就是您在反转字符串后得到垃圾的原因。

因此,您应该首先在 reverseString 中执行 reverse[i+1]=0;

我会说 reverse[counter] = '[=11=]'; 在它自己的函数中添加它。 看起来像

void reverseString(char* toReverse, char* reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    for (i; toReverse[counter] != '[=10=]'; i--) 
    {
        reverse[i] = toReverse[counter];
        counter++;
    }
    reverse[counter] = '[=10=]'; //add this
}

这有效!

您的代码有几个问题:

  • 您在 main 中为 reversed 设置空终止符的方式不正确,因为您在 reverse 仍未初始化时使用 strlen(reverse)。这是您获得垃圾输出的主要原因,因为空终止符未设置在正确的偏移量处,但这是未定义的行为,将未初始化的数组传递给 strlen 可能会产生更糟糕的后果。
  • 为保持一致性和简单性,应在 reverseString 中设置空终止符。
  • 你应该在复制字符之前递减 i,否则你创建的反转字符串向右移动一位。
  • 您应该用换行符结束 printf 格式字符串
  • main 应该 return 0.

这是更正后的版本:

void reverseString(const char *toReverse, char *reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    reverse[i] = '[=10=]';  /* set the null terminator */
    while (toReverse[counter] != '[=10=]') {
        reverse[--i] = toReverse[counter++];
    }
}

int main(int argc, char *argv[]) {
    char reverse[strlen(argv[1]) + 1];
    reverseString(argv[1], reverse);
    printf("The reverse string is '%s'\n", reverse);
    return 0;
}