【问题标题】:How do i store an (int)string into an int array我如何将(int)字符串存储到int数组中
【发布时间】:2015-05-12 21:17:53
【问题描述】:
int ascii[1000] = {0};
string *data = (string*)malloc ( 1000*sizeof( string));
char *text = (char*)malloc ( 1000 *sizeof( char));
cout << "Enter the first arrangement of data." << endl;
cin.getline(text, 1000);
char *token = strtok(text, " ");

while ( token != NULL )
{
    if ( strlen(token) > 0)
    {
        cout << "The tokens are: " << token << endl;
        data[Tcount++] = *token;

    }
    token = strtok(NULL, " ");

    for(i=0; i < (Tcount); i++)
      {
          ascii[i] = (int)data[i]; // error here
      }

我正在使用此代码构建解析器,并且我想将存储在“数据”中的标记的 ascii 值存储到名为“ascii”的数组中。
当我运行程序时,我收到错误消息,“错误:从不兼容的类型'string'(又名'basic_string,分配器>')分配给'int'
任何帮助将不胜感激。

【问题讨论】:

  • string::data() 也许?它会给你char *中的数组。刚刚在这里进行了测试,从charint 的显式转换工作正常。编辑:等等..我想我理解你的问题是错误的..这​​只有在你想要字符串中每个字符的 ascii int 时才有效。编辑 2. 如果您不介意 hack 并且您的数字限制为 1 位,您仍然可以使用它,因为您知道数字 0 的 ascii 值。
  • string *data = (string*)malloc ( 1000*sizeof( string)); 这是什么鬼? 0.o
  • 我是否正确地说这篇文章的绝大多数内容是无关紧要的,而您实际上是在问如何在 C++ 中将数字 string 解析为 int?因为这里和网络上的其他地方都有大量关于如何做到这一点的信息。至少在这里,您还可以免费获得警告,远离您正在进行的这种可怕的、可怕的 C 混搭!
  • 等一下,您如何期望asd 存储在int 中??
  • 不要使用malloc/free来分配std::string等C++对象,请改用new/delete操作符。那是因为可能需要为这些对象调用构造函数/析构函数。另外,这里甚至不需要它,只需使用std::string data;,它就会为您管理内存分配。

标签: c++ arrays string ascii


【解决方案1】:

这里的主要事件之前的一件事。显然你可以使用 std::string 所以,让我们以更文明的方式获取数据。

std::vector<std::string> data;
std::string line;
std::getline(cin, line); //read a whole line
std::stringstream tokenizer(line); // stuff the line into an object that's 
                                   // really good at tokenizing
std::string token;
while (tokenizer >> token) // one by one push a word out of the tokenizer 
{
    data.push_back(token); //and stuff it into a vector
}

我们现在已经将行中的所有单个单词打包到一个可调整大小的漂亮容器中,即矢量。无需清理混乱的动态内存。

第 2 步:将这些字符串转换为整数。 “恐怕你不能那样做,艾斯。您可以取一个表示数字的字符串并将其转换为 int。这很容易。有几十种方法来做到这一点。我喜欢strtol。

但是 ascii 值是逐个字符的。字符串是可变数量的字符。您可以将一个装入一个 int 中,将 int 移动一个字符的宽度,然后将其填充到另一个字符中,但是在 4 或 8 个字符之后您将用完空间。

让我们一起去吧,好吗?我们将使用旧方法而不使用迭代器。

std::string data;
int ascii = 0;

if (data.length() > 0)
{
    ascii |= data[index];
    for(size_t index = 0; index < data.length(); index++)
    {
        ascii <<= 8; //we're talking ascii here so no unicode bit counting games 
        ascii |= data[index];
    }
}

完成。不是很有用,除非所有的字符串都很短,但完成了。

如果你打算做一个解析器,为什么不全力以赴试试这个:

typedef void handlerfunc();
std::map<std::string, handlerfunc> parser;

parser["do something"] = somethingfunc;
parser["do something else"] = somethingelsefunc;

somethingfunc 是一个看起来像 void somethingfunc() 的函数,显然它做了一些事情。 Dito somethingelsefunc。只有它做其他事情。

用法可以这么简单:

parser[token]();

但事实并非如此。叹息。

更像是

found = parser.find(token)
if (found != parser.end())
{
    found->second();
    return CMD_OK;
}
else
{
    return CMD_NOT_FOUND;
}

但是说真的,看看一个好的容器可以为你做的一些有趣的事情。节省大量时间。

我在没有编译器的情况下编写了所有代码。请告诉我是否有任何不当之处。

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多