以我的方式反向编写字符串,有时会导致额外的输出,与字符' w '
Writing a string backwards my way, sometimes results into extra output, related to the character ' w '
这段简单的代码一直困扰着我:
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] = ' ';
代码中的两个问题。
首先,您希望backwards
为fnsize + 1
以允许字符串终止的结束(c风格的字符串需要,不包括在std::string::size()
方法返回值中)。
第二,使backwards
的最后一个元素成为' '
字符(字符串的结束字符)。如果没有这个,std::cout
不知道字符* '结束'的位置,所以你有时会得到垃圾字符。也就是说std::cout将继续输出字符,直到它到达' '
。
你也可以看看其他几个选项:
- 设置
std::string
并使用append(fullname[a-1])
- 使用
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;
}
相关文章:
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 字符的输入/输出操作
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- C++输出奇怪的字符而不是数字 (Windows)
- 如何存储 unicode 字符并将其输出到文件?
- C++中附加的字符*的奇怪输出
- 来自无符号字符缓冲区的虚拟输出
- 将未签名的字符写入输出文件
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 字符数组到十六进制字符串的转换 - 意外输出
- 存储和打印字符,但输出不是预期的
- 在函数中连接两个字符,并在 C++ 中返回输出
- 为什么要更改这两个代码的输出"&"字符?
- 输出字符时出现分段错误**
- 如何输出字符**
- C ++中的输出字符数组会产生奇怪的符号
- 输出字符的ASCII值
- 输出字符文字 { 以流C++
- 无法在结构中输出字符