Как сохранить строковые токены в переменные типа char? - PullRequest
1 голос
/ 05 сентября 2011

У меня есть строка, отправленная с использованием udp.Теперь я хочу прочитать строку, токенизировать ее и сохранить в массиве символов.Сохраняется только первая буква каждого слова.Так что я просто получаю 5 'e от element01 до element05.Я работаю в Arduino, и я знаю немного c #, но не c или c ++.

//p_params->packetBuffer contains the following string:
//element01#element02#element03#element04#element05

void packtStriper( receivedPacket * p_params )
{
  char delims[] = "#";
  char *result = NULL;
  int i = 0;

  //Tokenize string - 'split' it on hash mark
  result = strtok( p_params->packetBuffer, delims );

  //Iterate through the tokens and save them to my list
  while( result != NULL )
  {
    p_params->listData[i] = *result;
    i++;

    result = strtok( NULL, delims );
  }

  //Display the data just received
  for(int j =0; j<i; j++)
  {
    Serial.print( "Data " );
    Serial.print( j );
    Serial.print( ": " );

    Serial.println( p_params->listData[j] );
  } 
}

typedef struct receivedPacket
{
  char            * REQType;
  char            * confName;
  unsigned  int   confData[64];
  char            listData[10];
  char            packetBuffer[UDP_BUFFER_SIZE];
  int             packetSize;
  int             inProduction;

}receivedPacket;

Поскольку следующий код печатает полные имена элементов, которые, как я думал, я мог бы использовать только в результате.Но это также возвращает ошибку.

char str[] = "element01#element02#element03#element04#element05";
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, delims );
}

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Следующая строка:

p_params->listData[i] = *result

берет первый символ result и копирует его в i th символ p_params->listData. Таким образом, копируется только первый символ каждого токена. Как вы ожидаете получить эти токены как одну последовательность element01element02element03element04element05 или как массив строк?

Имейте в виду, что в C и C ++ массив символов содержит только одну строку, проще говоря. Чтобы содержать более одной строки, вам нужен массив массивов символов или некоторый разделитель (с которого вы начали ...).

Edit:

Если вы хотите получить массив строк, вы можете использовать следующее: объявлять listData как

char* listData[10];

, что означает listData, теперь может содержать до 10 строк. Затем вместо присвоения *result listData[i] используйте следующее:

p_params->listData[i] = strdup(result);

, которая создаст копию строки и сохранит ее в следующей записи.

Примечание:

  1. Если вы хотите отобразить строки, вам придется повторить цикл и распечатать их одну за другой. Вы не можете просто напечатать весь их массив.
  2. strdup выделяет память для вас. Вы должны free() эти строки, когда вы закончите с ними.
  3. Ваш код использует магические числа, что плохо. Я предполагаю, что это только для того, чтобы было легче читать здесь;)
  4. Если вы получите более 10 элементов, вы получите переполнение буфера, потому что listData может содержать только до 10 строк. Вы должны по крайней мере убедиться, что i не превышает 9 в while или около того.
2 голосов
/ 05 сентября 2011

result - указатель на символ (который может быть элементом в массиве символов), тогда как *result - это символ, на который он указывает.Таким образом, строка

p_params->listData[i] = *result;

помещает символ в p_params->listData[i].

Строки в C представлены массивом типа char и обычно заканчиваются символомноль (то есть значение 0).Похоже, вам нужен массив строк, который вы можете создать в виде двухмерного массива.Например:

// 5 strings each with 9 characters and a null terminator
char ArrayOfStrings[5][10];

Затем вы можете скопировать один токен в каждую строку, используя функцию strcpy() или strncpy().Я бы порекомендовал использовать strncpy() в целях безопасности (чтобы вы не копировали больше символов, чем у вас есть место), и вручную установите для последнего элемента каждой строки значение null.

...