0

这让我很困惑,简单的代码:

int main()
{
    typedef std::string::size_type stype;
    std::cout << "What is your first name?\n";
    std::string first,second,fullname;
    std::cin >> first;
    std::cout << "What is your second name?\n";
    std::cin >> second;
    char * backwards;
    fullname = first + " " + second;
    stype fnsize = fullname.size();    
    backwards = new char [fnsize];
    stype b = 0;
    for(stype a = fnsize; a != 0; --a)
    {
       backwards[b++] = fullname[a - 1];
    }
    std::cout << backwards << std::endl;
    return 0;
}

大部分时间都有效,但是当我写一个像我自己的名字stanislaw terziev时,我得到一个输出veizret walsinatsslaw而不是veizret walsinats

为什么会这样?

4

3 回答 3

6

我猜你忘记了 null 终止符'\0',你需要:

backwards = new char [fnsize+1];
backward[fnsize] = '\0';
于 2013-01-13T23:45:15.950 回答
2

您的代码中有两个问题。

首先,您要backwards允许fnsize + 1结束字符串终止(对于 C 样式字符串是必需的,不包含在std::string::size()方法返回值中)。

backwards其次,制作字符的最后一个元素'\0'(字符串字符的结尾)。没有这个,std::cout不知道 char* '结束'在哪里,所以你有时会得到垃圾字符。也就是说 std::cout 会一直输出字符,直到碰到'\0'.

您还可以查看其他几个选项:

  1. 倒转 astd::string并使用append(fullname[a-1])
  2. 利用std::reverse
于 2013-01-13T23:54:22.200 回答
1

您可以更干净地执行此操作,而无需自己管理内存(或担心 nul 终止符):

#include <string>
#include <iostream>

int main()
{
    std::cout << "What is your first name?\n";
    std::string first, second;
    std::cin >> first;
    std::cout << "What is your second name?\n";
    std::cin >> second;
    std::string fullname(first + " " + second);
    std::string backwards(fullname.rbegin(), fullname.rend()); // use reverse iterator
    std::cout << backwards << std::endl;
    return 0;
}
于 2013-01-13T23:51:26.547 回答