如何将(int)字符串存储到 int 数组中

How do i store an (int)string into an int array

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
      }

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

这里是主要事件之前的一件事。显然你可以使用 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 个字符后从 space 中取出 运行。

让我们开始吧,好吗?我们将在没有迭代器的情况下使用旧方法。

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;
}

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

我没有编译器就把所有的代码都写出来了。如果我感到厌烦,请告诉我。