迭代地反转C中的字符串

时间:2016-02-20 17:42:30

标签: c string reverse

我试图在C中反转一个字符串,我能够完成这个但不是没有我不太了解的副作用。这是我的代码来反转一个字符串:

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

您应在\0字符串中设置空终止reverse,以printf格式使用%s来打印正确反转的字符串。

void reverseString(char* toReverse, char* reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    for (i; toReverse[counter] != '\0'; i--) {
        reverse[i] = toReverse[counter];
        counter++;
    }
    reverse[counter] = '\0'; //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] != '\0'; i--) {
        reverse[i] = toReverse[counter];
        counter++;
    }
    reverse[counter] = '\0'; //add this
}

答案 1 :(得分:1)

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

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

这有效!

答案 2 :(得分:1)

您的代码有几个问题:

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

以下是更正后的版本:

void reverseString(const char *toReverse, char *reverse) {
    int i = strlen(toReverse);
    int counter = 0;
    reverse[i] = '\0';  /* set the null terminator */
    while (toReverse[counter] != '\0') {
        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;
}

答案 3 :(得分:0)

你的字符串不是以空值终止的,这就是你在反向字符串后得到垃圾的原因。

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