5

我想制作一个程序,首先输入字符串数组,然后将其转换为整数,然后将其推送到向量。

代码是这样的:

string a;
vector<long long int> c;
cout << "Enter the message = ";
cin >> a;   
cout << endl;

cout << "Converted Message to integer = ";
for (i=0;i<a.size();i++) 
{
    x=(int)a.at(i);
    cout << x << " "; //convert every element string to integer
    c.push_back(x);
}

输出 :

Enter the message = haha
Converted Message to integer = 104 97 104 97

然后我把它写在一个文件中,在下一个程序中我想读回它,并将它转换回字符串,我的问题是如何做到这一点?将向量 [104 97 104 97] 转换回字符串“haha”。

我真的很感激任何帮助。谢谢。

4

5 回答 5

6

[...] 我的问题是如何做到这一点?将向量 [104 97 104 97] 转换回字符串“haha”。

这很容易。您可以遍历std::vector元素,并使用std::string::operator+=重载来连接结果字符串中的字符(其 ASCII 值存储在 中std::vector)。

例如

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
  vector<int> v = {104, 97, 104, 97};
  string s;

  for (auto x : v)
  {
    s += static_cast<char>(x);
  }

  cout << s << endl;
}

控制台输出:

C:\TEMP\CppTests>g++ test.cpp

C:\TEMP\CppTests>a.exe
haha

只是对您的原始代码的一个小注释:

x=(int)a.at(i);

您可能希望在您的代码中使用C++ 风格的转换而不是旧的 C 风格的转换(即static_cast在上面的代码中)。

此外,由于您知道向量的大小,您还应该知道有效索引从0to (size-1),因此使用简单快速高效std::vector::operator[]的重载就可以了,而不是使用std::vector::at()方法(具有索引边界检查开销)。

所以,我会像这样更改您的代码:

x = static_cast<int>( a[i] );
于 2013-08-07T10:00:39.040 回答
5
 std::vector<int> data = {104, 97, 104, 97};
std::string actualword;
char ch;
for (int i = 0; i < data.size(); i++) {

    ch = data[i];

    actualword += ch;

}
于 2013-08-07T10:02:04.753 回答
3
#include <algorithm>
#include <iostream>

int main()
{
    std::vector<int> v = { 104, 97, 104, 97 };

    std::string res(v.size(), 0);
    std::transform(v.begin(), v.end(), res.begin(),
        [](int k) { return static_cast<char>(k); });

    std::cout << res << '\n';
    return 0;
}

两个注意事项:

  1. 强烈建议将您的矢量更改为std::vector<char>- 这将使这项任务更容易,并且static_cast<char>(k)具有潜在危险。
  2. 始终避免使用 C 风格的强制转换。如果您确实需要,请使用reinterpret_cast,但在您的情况下, astatic_cast也可以做到这一点。C 风格的强制转换做了很多坏事,比如隐式const强制转换或出卖你的灵魂。
于 2013-08-07T09:56:21.307 回答
3

使用std::string的迭代器构造函数:

std::vector<long long int> v{'h', 'a', 'h', 'a'}; //read from file
std::string s{std::begin(v), std::end(v)};
std::cout << s; //or manipulate how you want

但是,它确实提出了一个问题,为什么您的向量包含long long int何时应该只存储字符。尝试将其转换为字符串时请注意这一点。

于 2013-08-07T09:56:42.923 回答
1

您可以使用 std::transform 使用您自己的函数对象或 lambda 函数进行反向转换,即 (char)(int)。

于 2013-08-07T09:52:49.137 回答