【问题标题】:Store pointer in array将指针存储在数组中
【发布时间】:2014-08-12 06:46:38
【问题描述】:

我使用strtok 来标记一个数组。我想将 strtok 返回的 char 指针存储到一个数组中。

  char exp[] = {"1000 + 1000"};
  char operands[50];
  p = strtok(exp, " ");

现在我想将 p 的值(即 1000)存储到操作数 [i] 数组中。我试过这样:

memcpy(&operands[i], p, 49);

但它只复制一个整数。

【问题讨论】:

  • 这真的是 C++ 吗?为什么 49 作为 memcpy 的最后一个参数?
  • strcpy(operands, p)?
  • std::string 是你的朋友。
  • "但它只复制一个整数。" - 这就是 strtok 所做的 - 在第一个标记之后将 NUL 字符放入 exp[],这样您的 memcpy (具有未定义的行为,因为 49 比 sizeof exp 大得多)复制“1000\0+ 1000 \0" 和大约 40 个其他乱码。听听 Bathsjeba - 如果你使用 std::string,你不太可能搞砸,如果你这样做,你有更好的机会得到错误的字符串输出,而不是让你的程序崩溃。
  • 我开始用 c 编程,所以我仍然使用 c 函数。 (我看到了 49,但在这种情况下不会有所作为。)

标签: c++ variables pointers strtok


【解决方案1】:

我猜您实际上并不想将p 指向的字符串复制到字符数组operands 中。相反,在我看来,您希望 operands 成为指向 char指针 数组,即

char *operands[50];

那你就可以了

operands[i] = p;

(注意:i 必须是有效索引,范围为 0


但是,以上是 C 问题的 C 解决方案。如果您使用 C++ 编程,您可能应该改用 std::stringstd::vector

std::vector<std::string> operands;

...

operands.push_back(p);

当然,如果您使用 C++ 编程,则根本不应该使用字符数组和 strtok,而应使用 C++ standard library 中的功能进行标记。

【讨论】:

    【解决方案2】:
    char exp[] = {"1000 + 1000"};
    char operand[50];
    char* p = strtok(exp, " ");
    memcpy(&operand[0], p, 5);
    

    上面的代码运行后,在char数组操作数中,

    前5个被赋值

    操作数[0] = '1' 操作数[1] = '0' 操作数[2] = '0' 操作数[3] = '0' operand[4] = 0 // char 数组的结束字符

    其他人没有赋值'?'

    操作数[i] = '?'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2019-12-18
      相关资源
      最近更新 更多