c++中数组只存储token的第一个字符

Only the first character of token is stored in array in c++

    int main(void)
{
char *text = (char*)malloc ( 100 *sizeof( char));
cout << "Enter the first arrangement of data." << endl;
cin.getline(text, 100);
char *token = strtok(text, " ");
char *data = (char*)malloc ( 100*sizeof( char));
while ( token != NULL )
{
    if (strlen(token) > 0)
    {
        cout << token << endl; // to test if the token is correct so far.
        data[Tcount++] = *token;
    }
    token = strtok(NULL, " ");
}


for(i = 0; i < Tcount; i++)
{
    cout << data[i] << endl;
}  

出于某种原因,当我输入用户输入 xp = a + 1 时,data[i] 的输出是:
x
=
一个
+
1
你知道为什么第一个标记(应该是 xp)只作为 x 存储在 data[] 中吗?
谢谢。

因为您的 token 数组是一个字符数组 (*char)。您需要创建一个字符串数组 (**char) 来存储 "xp",因为它不是 char 变量。

有几处不太正确。

  1. "data[Tcount++] = *token;" 部分正在将值 "token"(字符)分配给也是字符的 "data[Tcount]"。

  2. 我相信 "data" 包含内存中 100 * sizeof (char) 开头的地址。当 "data[i]" 被访问时,它是一个单一的 "char"

for(i = 0; i < Tcount; i++) { cout << data[i] << endl; }

  1. 如果要存储字符串列表(字符数组),则需要使用二维数组(或指针)以便每个数组(或指针)可以存储一个数组(或指针)。 例如,使用 data[][] 或 **data。如果您想刷新这些定义,请参阅下面的链接;

点击reference to pointer of pointer in c++

点击reference to arrays in c++

strtok 有一些您没有考虑到的内部状态。看这里:

http://www.cplusplus.com/reference/cstring/strtok/

这一行只抓取token的第一个字符:

    data[Tcount++] = *token;

然后这一行跳到下一个标记(由于 strtok 的内部状态记住最后一个标记的位置):

    token = strtok(NULL, " ");

您需要在包含这两行的while 循环中再嵌套一个循环,以便读取一个标记中的所有字符。只有这样你才能在不丢失数据的情况下再次调用strtok。