以我的方式反向编写字符串,有时会导致额外的输出,与字符' w '

Writing a string backwards my way, sometimes results into extra output, related to the character ' w '

本文关键字:输出 字符 我的方式 字符串      更新时间:2023-10-16

这段简单的代码一直困扰着我:

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 walsinatslaw 而不是veizret walsinats

为什么会这样?

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

backwards = new char [fnsize+1];
backward[fnsize] = '';

代码中的两个问题。

首先,您希望backwardsfnsize + 1以允许字符串终止的结束(c风格的字符串需要,不包括在std::string::size()方法返回值中)。

第二,使backwards的最后一个元素成为''字符(字符串的结束字符)。如果没有这个,std::cout不知道字符* '结束'的位置,所以你有时会得到垃圾字符。也就是说std::cout将继续输出字符,直到它到达''

你也可以看看其他几个选项:

  1. 设置std::string并使用append(fullname[a-1])
  2. 使用std::reverse

无需管理内存(或担心null终止符),您可以更干净地完成此操作:

#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;
}