反转一个字符串,奇怪的输出c ++

时间:2011-07-11 02:39:44

标签: c++ string char reverse cstring

好的,所以我试图在C ++中反转一个C风格的字符串,我正在尝试一些奇怪的输出。也许有人可以解释一下?

这是我的代码:

 int main(){    

    char str[] = "string";
    int strSize = sizeof(str)/sizeof(char);

    char str2[strSize];

    int n = strSize-1;
    int i =0;


    while (&str+n >= &str){ 
        str2[i] = *(str+n);         
        n--;
        i++;
    }

    int str2size = sizeof(str)/sizeof(char);
    int x;

    for(x=0;x<str2size;x++){
        cout << str2[x];
    }

}

这里的基本思想是将指针指向字符串的结尾,然后使用指针算法将其向后读入新数组。

在这种特殊情况下,我得到一个输出:“gnirts” 任何输出的开头都有一个烦人的空间,我假设它是空字符?但是当我试图通过递减strSize变量来排除它时,我最终在字符串另一端的一些其他字符可能来自另一个内存块。

有关如何避免这种情况的任何想法? PS :(你们会认为这是一个反转字符串的好主意吗?)

6 个答案:

答案 0 :(得分:7)

有效字符串应以空字符结尾。因此,您需要将空字符保留在其原始位置(在字符串的末尾),并仅反转非空字符。所以你会有这样的事情:

str2[strSize - 1] = str[strSize - 1]; // Copy the null at the end of the string

int n = strSize - 2; // Start from the penultimate character

答案 1 :(得分:1)

我会让C ++标准库做更多的工作......

#include <cstddef>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    typedef std::reverse_iterator<char const*> riter_t;

    char const str[] = "string";
    std::size_t const strSize = sizeof(str);
    char str2[strSize] = { };
    std::copy(riter_t(str + strSize - 1), riter_t(str), str2);
    std::cout << str2 << '\n';
}

答案 2 :(得分:1)

标准库中有一个算法可以反转序列。为什么重新发明轮子?

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

int main()
{
   char str[] = "string";

   std::reverse(str, str + strlen(str)); // use the Standard Library

   std::cout << str << '\n';
}

答案 3 :(得分:1)

@ildjarn和@Blastfurnace已经提出了很好的想法,但我想我会更进一步,并使用迭代器来构建反向字符串:

std::string input("string");

std::string reversed(input.rbegin(), input.rend());

std::cout << reversed;

答案 4 :(得分:0)

 while (&str+n >= &str){

这是胡说八道,你只想

while (n >= 0) {

 str2[i] = *(str+n);

应该更具可读性

str2[i] = str[n];

答案 5 :(得分:0)

您的while循环条件(&str+n >= &str)相当于(n >= 0)

您的*(str+n)相当于str[n],我更喜欢后者。

正如HappyPixel所说,你应该在n开始strSize-2,所以复制的第一个字符将是str的最后一个实际字符,而不是str的空终止字符。

然后,在复制循环中的所有常规字符后,需要使用str2str2[strSize-1] = 0;的末尾添加空终止字符。

这是修复的工作代码,输出“gnirts”:

#include <iostream>
using namespace std;
int main(int argc, char **argv){    
    char str[] = "string";
    int strSize = sizeof(str)/sizeof(char);

    char str2[strSize];

    int n = strSize-2;  // Start at last non-null character
    int i = 0;

    while (n >= 0){ 
        str2[i] = str[n];         
        n--;
        i++;
    }
    str2[strSize-1] = 0;   // Add the null terminator.

    int str2size = sizeof(str)/sizeof(char);
    int x;

    cout << str2;
}