反转以null结尾的字符串(C ++)

时间:2016-07-13 01:11:20

标签: c++ string

对我的代码有一些澄清问题;问题是逆转空终止字符串。

以下是完整的参考代码:(编译和运行)

#include <iostream>
#include <cstring>
using namespace std;

void reverseString (char *str) {

    char *end = str;
    char temp;

    while (*end != '\0')
    {
        end ++;
    }
    end--;

    //swap
    while (str < end) {
        temp = *str;
        *str++ = *end;
        *end-- = temp;
    }
}

int main() {

    char str[] = "hello!";

    reverseString (str);
    cout << str;
}
while (str < end)

上面的语句是否比较了指针的地址?由于str是一个指针而end也是一个,并且指针包含地址,它是否检查str的地址是否小于end?

*str++ = *end;

此行将取消引用存储在end中的值,并将其设置为等于str的值。然后递增指针str?

最后,(最坏情况)时间复杂度 O(n)

2 个答案:

答案 0 :(得分:1)

第一个和第三个问题的答案是肯定的。在第二个问题中你有相反的变量(str被取消引用,设置,然后递增,而不是相反)。具体来说:strend都被取消引用(这就是*运算符所做的)。取消引用的str设置为已解除引用的end。然后str递增。

此外,reverseString()将在数组末尾运行,导致未定义的行为,如果传入的字符串为空,则可能发生崩溃。需要在那里添加额外的代码来处理这种可能性,作为边缘情况。

答案 1 :(得分:1)

你有没有理由不使用STL?特别是std::reverse

#include <iostream>
#include <cstring>
#include <algorithm>

int main() {
    char str[] = "hello!";
    std::reverse(str, str + std::strlen(str));
    std::cout << str;
}