1

我有一个从文本文件中获得的字符串,我想将它与逗号分隔,并将每个项目设置在一个数组中。我对如何编码有一个大致的想法,但我想确保没有任何更简单的方法可以做到这一点。有这样做的功能吗?我想要类似于 python 中的 split() 的东西,以在 CAPL 中使用。

char dataString[200] = "MAX_VOLT,  MAX_CURR,  MAX_TIME,  TEMP,  A0_MAX";

char dataArray[5][50] = {"MAX_VOLT","MAX_CURR","MAX_TIME","TEMP","A0_MAX"};
4

3 回答 3

1

我实现了一个最小的 CAPL 脚本来测试我的想法:

variables {
  char dataString[200] = "MAX_VOLT,  MAX_CURR,  MAX_TIME,  TEMP,  A0_MAX";
  long pos1, pos2, pos3, pos4, pos5;
  char dataArray[5][50];
}

on start {
  int i;

  pos1 = strstr(dataString, ",");
  pos2 = strstr_off(dataString, pos1+1, ",");
  pos3 = strstr_off(dataString, pos2+1, ",");
  pos4 = strstr_off(dataString, pos3+1, ",");
  pos5 = strlen(dataString);
  write("pos1 = %d, pos2 = %d, pos3 = %d, pos4 = %d, pos5 = %d", pos1, pos2, pos3, pos4, strlen(dataString));

  // get first string 
  for (i = 0; i < pos1; i++) {
    dataArray[0][i] = dataString[i];
  }
  // get second string 
  for (i = 0 ; i < pos2 - pos1 - 3; i++) {
    dataArray[1][i] = dataString[i + pos1 + 3];
  }
  // get third string 
  for (i = 0 ; i < pos3 - pos2 - 3; i++) {
    dataArray[2][i] = dataString[i + pos2 + 3];
  }
  // get fourth string 
  for (i = 0 ; i < pos4 - pos3 - 3; i++) {
    dataArray[3][i] = dataString[i + pos3 + 3];
  }
  // get fifth string 
  for (i = 0 ; i < pos5 - pos4 - 3; i++) {
    dataArray[4][i] = dataString[i + pos4 + 3];
  }

  write("%s", dataArray[0]);
  write("%s", dataArray[1]);
  write("%s", dataArray[2]);
  write("%s", dataArray[3]);
  write("%s", dataArray[4]);
}

输出:

CAPL    pos1 = 8, pos2 = 19, pos3 = 30, pos4 = 37, pos5 = 46
CAPL    MAX_VOLT
CAPL    MAX_CURR
CAPL    MAX_TIME
CAPL    TEMP
CAPL    A0_MAX
于 2017-10-13T09:40:27.683 回答
0

类似于 Python 的 CAPL 中似乎不存在可以轻松拆分字符串的函数。我写这个是为了实现类似的东西。

variables
{
  char dataString[200] = "MAX_VOLT,MAX_CURR,MAX_TIME,TEMP,A0_MAX";
  char dataArray[10][50];
}

on start
{
  split_string(dataString, ",");
  write("%s", dataArray[0]);
  write("%s", dataArray[1]);
  write("%s", dataArray[2]);
  write("%s", dataArray[3]);
  write("%s", dataArray[4]);
}

int split_string(char string[], char delim[])
{
  int start_pos, end_pos;
  int i, j;
  int num_strings;
  
  start_pos = 0;
  end_pos = 0;
  num_strings = 0;
  
  while (start_pos < strlen(string))
  {
    j = 0;
    end_pos = strstr_off(string, start_pos, delim);
    if (end_pos == -1)
    {
      end_pos = strlen(string);
    }
    for (i=start_pos; i<end_pos; i++)
    {
      dataArray[num_strings][j++] = string[i];
    }
    dataArray[num_strings][j] = '\0';
    num_strings++;
    start_pos = end_pos+strlen(delim);
  }
  
  return num_strings;
}

它不会删除空格,但可以通过使用 str_replace 轻松添加。

于 2022-01-11T17:21:09.703 回答
0

这只是一个想法,我没有测试。首先我会得到你所有逗号的位置dataString[200]。使用该函数strstr(char s1[], char s2[]);获取第一个逗号在dataString. 使用第一个逗号位置作为输入参数offset,以使用strstr_off(char s1[], long offset, char s2[]);. 剩余的逗号也一样。

dataString然后我会使用 for 循环使用逗号位置将字符从to复制dataArray。如果您dataArray在 CAPL 脚本中使用相同的内容,请确保在dataArray处理不同长度的字符串并重新填充dataArray新字符串时清空字符串。希望这可以帮助。

于 2017-10-13T09:01:09.167 回答