【问题标题】:Split a string array in different strings in C++ that I have to receive as input parameter from C#在 C++ 中将字符串数组拆分为不同的字符串,我必须从 C# 作为输入参数接收
【发布时间】:2015-05-29 10:57:39
【问题描述】:

我在 C# 中有一个函数,它必须将字符串数组的输出参数传递给 C++

这些字符串数组需要拆分成单独的字符串。

C#:-

void calculate(string[] data)
{
            data = new string[5];
            data [0] = keycol[0].ToString() + "|"+ valuecol[0].ToString()+ "|"+Column_name[0];
            data [1] = keycol[1].ToString() + "|" + valuecol[1].ToString()+ "|"+Column_name[1];
            data [2] = keycol[2].ToString() + "|" + valuecol[2].ToString()+ "|"+Column_name[2];
            data [3] = keycol[3].ToString() + "|" + valuecol[3].ToString() + "|" + Column_name[3];           
}

C++:

#include <string>
#include <vector>
void calculate(char *data[5])
{

vector<string> v;
string s = data[0];
split(s, '|', v);

}

void split(const string& s, char c,
           vector<string>& v) {
   string::size_type i = 0;
   string::size_type j = s.find(c);

   while (j != string::npos) {
      v.push_back(s.substr(i, j-i));
      i = ++j;
      j = s.find(c, j);

      if (j == string::npos)
         v.push_back(s.substr(i, s.length()));
   }

我从 C# 得到的数据是这样的: cmb1|2|col1,col3

cmb2|1|col2

cmb3|1|col4

这已正确存储在 C# 中的数据数组中。 当我将它发送到 C++ 时,我遇到了这个问题。 当我拆分存储在数据中的字符串时,我只得到一个字符。

我需要这样的 C++ 结果:

string c1 = cmb1;
string c2 = 2;
string c3 = col1;
string c4 = col2; 

 string c5= cmb2;
  string c6 =1;
string c7 =col2;

【问题讨论】:

  • 对于这样简单的事情,您可能想尝试使用std::istringstream 和std::getline。
  • 另外,你确定关于calculate的论点吗?因为现在你说数据是指向char的指针数组,而不是字符串数组(指向char或char *data[]的指针数组)。
  • 为什么会有反对票??

标签: c# c++ arrays string


【解决方案1】:

签名错误...使用

void calculate(char **data)

或类似的东西,例如

void calculate(char *data[])

Visual Studio 向我显示了由该行引起的错误:

'initializing' : 无法从 'char **' 转换为 'std::basic_string,std::allocator>'

完整的代码应该是这样的:

extern "C"
{
    __declspec(dllexport) void calculate(char *data[5])
    {
        for (int i = 0; i < 5; i++)
        {
            vector<string> v;

            if (!data[i])
            {
                continue;
            }

            string s = data[i];
            split(s, '|', v);
        }
    }
}

(可能您使用的是宏而不是 __declspec(dllexport),例如 LIBRARY_API 或其他东西...继续使用它并删除 __declspec(dllexport))

PInvoke 签名 C# 端类似于:

[DllImport("yourdllname", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void calculate(string[] data);

【讨论】:

  • 我需要将它们分配为数据的固定值[5],所以我怎样才能得到它们@xanatos
  • @TechBrkTru 您不需要将数组的大小放在签名中。如果你愿意,你可以像void calculate(char *data[5]) 这样写,但它没有任何效果(除了向班级的用户发出“正确”大小的信号)
  • @TechBrkTru 按照我写的进行更改。有用。我已经在 pinvoke C#->C++ 中对其进行了测试。这三种语法是等价的。
  • 一个问题,所有数据都存储在字符串 s 中,这不是我想要的,我希望它们存储在不同的变量中 @xanatos
  • @TechBrkTru 编写的代码会将分割的部分移动到向量v。从那里你可以做一个string c1 = v[0]; string c2 = v[1]; ...
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多