我的大学作业需要帮助。我还是新手。
基本上我正在进行游程编码,而且我不知道如何在计数器后添加字母:
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
void error(std::string str)
{
throw std::runtime_error(str);
}
int main()
{ int counter = 1;
std::string id;
std::vector<int> v;
std::cout << "Enter the data to be compressed: ";
std::cin >> id;
try
{ for(int i = 0; i < id.size(); i++)
{
if(std::isdigit(id[i]))
error("invalid input");
}
std::cout << "The compressed data is: ";
for(int i = 0; i < id.size(); i++)
{
if(id[i] == id[i+1])
{
counter++;
}
else if(id[i]!= id[i+1])
{
v.push_back(counter);
v.push_back(id[i]);
counter=1;
}
}
for(int j = 0; j < v.size(); j++)
std::cout << v[j];
}
catch(std::runtime_error& str)
{
std::cerr << "error: " << str.what() << std::endl;
return 1;
}
return 0;
}
例如,如果我输入aaabbb,则probram应输出3a3b。问题是它输出397398 97和98是a和b的ascii代码。 我不知道如何将信件放在柜台后面,并让他们在同一个载体中。
答案 0 :(得分:0)
如果您想序列化为字符串,请尝试以下方法:
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
#include <sstream>
void error(std::string str) {
throw std::runtime_error(str);
}
int main() {
std::ostringstream stream;
int counter = 1;
std::string id;
std::cout << "Enter the data to be compressed: ";
std::cin >> id;
try {
for (int i = 0; i < id.size(); i++) {
if (std::isdigit(id[i]))
error("invalid input");
}
std::cout << "The compressed data is: ";
for (int i = 0; i < id.size(); i++) {
if (id[i] == id[i + 1]) {
counter++;
} else if (id[i] != id[i + 1]) {
stream << counter;
stream << (char) id[i];
counter = 1;
}
}
std::cout << stream.str() << std::endl;
} catch (std::runtime_error& str) {
std::cerr << "error: " << str.what() << std::endl;
return 1;
}
}
答案 1 :(得分:0)
v[j]
的 std::cout << v[j]
类型为int
,这就是std::cout
写入数字的原因。要将其编写为角色,您应该将v[j]
投射到char
,如下所示:std::cout << (char)v[j]
。这样,std::cout
将使用char
专精,而不是int
专长。
答案 2 :(得分:0)
虽然其他答案可能会为您提供所需的输出,但我认为解决此问题的惯用方法是使用一个类来保存字符及其计数。有两个明显的选择。
如果您因为一致性或其他原因而喜欢它,也可以是std::tuple
。将结果保存在std::vector<std::pair<char, int>
。这样可以保存信息,但要打印它,您需要定义一个合适的功能。通过
v.emplace_back(character, count);
如果要在没有外部辅助类的情况下提供某些功能,请定义自定义包装类,如下所示。
class CharacterCount {
private:
char character;
int count;
public:
CharacterCount(char character, int count):
character(character), count(count) {}
explicit operator std::string() const { return std::to_string(count) + character;
// Other helper functions or constructors you require
}
这简化了打印
for (auto& character_count : v)
std::cout << static_cast<std::string>(character_count);
我相信因为std::ostream::operator<<
是模板化的,所以无法隐式转换为std::string
。无论如何,我会建议不要进行隐式转换。
您可以使用与以前相同的emplace_back
语法,因为我们提供了适当的构造函数。
答案 3 :(得分:0)
所以你在string
中输入你的输入并最终只需要将这些信息流出来,最终意味着没有理由将信息存储在vector
中,只输出它!您可以将find_if
与lambda一起使用来查找非连续字符(如果您愿意,可以使用find_if_not
。)
for(string::const_iterator finish, start = cbegin(id); start != cend(id); start = finish) {
finish = find_if(start, cend(id), [value = *start](const auto i) { return i != value; } );
cout << distance(start, finish) << *start;
}