C++,我收到一个无法理解的编译器错误
In C++, I'm getting a compiler error that I can't make sense of
这是我的代码,它只是颠倒了句子:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string sentence;
string reversedSentence;
int i2 = 0;
cout << "Type in a sentence..." << endl;
getline(cin, sentence);
for (int i = sentence.length() - 1; i < sentence.length(); i--)
{
reversedSentence[i2] = sentence[i];
i2++;
}
cout << reversedSentence << endl;
}
编译工作正常,但当我尝试运行程序时,会发生以下情况:
Type in a sentence...
[input]
/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed.
reversedSentence
字符串为空,因此对其进行索引会调用未定义的行为。相反,您可以这样使用push_back
:
for (int i = sentence.length() - 1; i >= 0; i--)
{
reversedSentence.push_back(sentence[i]);
}
还要注意,您的循环条件需要修改。如果sentence
为空,则在减去1之前,应将static_cast
、.length()
和int
相加,如下所示:
for (int i = static_cast<int>(sentence.length()) - 1; i >= 0; i--)
{
reversedSentence.push_back(sentence[i]);
}
你也可以使用一种算法:
reversedSentence = sentence;
std::reverse(reversedSentence.begin(), reversedSentence.end());
这避免了sentence
字符串为空时的复杂情况。
您的for循环表示i < sentence.length()
是结束条件。这导致它始终是true
,并且从不访问for循环,因为您将i
声明为sentence.length() - 1
。这将始终小于sentence.length()
。
for (auto iter = sentence.rbegin(); iter != sentence.rend(); ++iter)
{
reversedSentence.push_back(*iter);
}
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
int main()
{
std::string sentence;
std::cout << "Sentence: ";
std::getline(std::cin, sentence);
std::stringstream sstrin(sentence);
int spaces = std::count(sentence.begin(), sentence.end(), ' ');
std::vector<std::string> chunks;
chunks.reserve(spaces + 1);
while (sstrin) {
std::string tmp;
sstrin >> tmp;
chunks.push_back(tmp);
}
std::ostream_iterator<std::string> strout(std::cout, " ");
std::cout << "Words in reverse:n";
std::copy(chunks.rbegin(), chunks.rend(), strout);
std::cout << "nFull Mirror:n";
std::ostream_iterator<char> charout(std::cout);
std::copy(sentence.rbegin(), sentence.rend(), charout);
std::cout << 'n';
}
你所说的反向有点不清楚。你的代码指示了我所说的";全反射镜";其中所有字符的顺序是向后的。但也有可能你只是想把单词倒过来,这是当人们说他们想要一个倒过来的句子时,我首先想到的。根据你想要的不同,你做这件事的方式也不同。
对于相反的单词,我需要确保每个单词都被视为自己的实体。为此,我声明了一个字符串向量,其中每个元素都是一个单独的单词。我使用字符串流,因为它可以为我分离单词,而不必编写手动检查句子的函数。这是因为默认情况下,流在空白处是分开的。一旦矢量被单词填满,我就开始按相反的顺序打印它们。我用std::ostream_iterator
来做这件事。它比基于范围的for更紧凑,并允许我利用向量的反向迭代器;它省去了我反转矢量的麻烦。
对于";全反射镜;我同样使用std::ostream_iterator
,但它是由字符组成的,因为我提供了原始句子的反向迭代器。字符串的各个元素都是字符。
最后,没有迹象表明你是否需要保存这些颠倒的句子,所以我不介意。
for (int i = sentence.length() - 1; i < sentence.length(); i--)
你为什么要写一个无穷循环??你正在减少i,它总是小于句子.length((……我会使用:
for(int i = sentence.length() - 1; i > 0; i--)
如果我是你。。。。
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- C++2440错误-编译器认为字符串是常量字符
- Clang 错误 – 编译器错误或缺少一些细节?
- 视觉C++ 2017 错误?编译器优化表达式
- 配置:错误:C++编译器无法创建可执行文件
- PHP PDO_ODBC配置:错误:C 编译器无法创建可执行文件
- 致命错误 C1001:内部编译器错误(编译器文件"MSC1.cpp",第 1794 行)
- 错误:编译器限制达到简单hello world程序的堆限制
- c++链接错误:编译器找不到函数的定义
- 生成 CImg 时出现致命错误(编译器限制)
- 抛出对齐类型时出现 Clang 运行时错误.编译器错误