Я пишу программу Microcontroller с помощью Keil-Compiler. Программа создает несколько CSV-подобных строк (Logging-Lines). Например: «A; 001; ERROR; C05; ... \ n» . Чтобы сэкономить место, теперь я хочу уменьшить данные, просто зарегистрировав различия. Поэтому я сохраняю последнюю записанную строку и сравниваю ее с новой. Если значение в столбце одинаковое, я хочу просто опустить его. Например: "A; 001; ОШИБОК; C05; ... \ п" < - предыдущая LogTokenizing multiple String в C с компилятором KEIL
"A; 002; ОШИБКА; С06; ... \ п" < - новый Вход
приведет к «; 002 ;; C06; ... \ n"
Сначала я только что включил <string.h>
и использовал 'strtok' для перехода через мою CSV-линию. Поскольку мне нужно сравнить 2 строки/строки, мне нужно будет использовать их одновременно на двух разных строках, которые не работают. Поэтому я перешел на «strtok_r», который, кажется, не работает:
token1 = strtok_r(m_cActLogLine, ";", pointer1);
while (token1 != NULL) {
token1 = strtok_r(NULL, ";", pointer1);
}
Это просто дает мне странное поведение. Обычно второй вызов 'strtok_r' просто возвращает NULL, и цикл остается. Так может быть, еще один способ добиться желаемого поведения?
EDIT:
Чтобы пояснить, что я имею в виду, это то, что я в настоящее время пытается добраться до работы: Мой Input (m_cMeasureLogLine) является «M; 0001; 001; 01; 40; 1000,00; 0,00; 1000,00; 0,00; 360,00; 0,00; 400,00; 24,90; 400,00; -9999,00; -9999,00; -9999,00; 0; LED ;;;;; 400,00; 34,40; 25,41; 27,88; 29,01; 0,00; 0,00; 0,00; - 100,00; 0,00; -1000,00; -1000,00; -103,032; -70,192; 19; 8192,00; 0,00; 0;»
char m_cActLogLine[MAX_SIZE_PARAM_LINE_TEXT];
char* token1;
char* token2;
char** pointer1;
char** pointer2;
void vLogProtocolMeasureData()
{
strcpy(m_cActLogLine, m_cMeasureLogLine);
token1 = strtok_r(m_cActLogLine, ";", pointer1);
while (token1 != NULL) {
token1 = strtok_r(NULL, ";", pointer1);
}
}
функция является частью более крупного проекта, внедренного поэтому я не имею консольный вывод, но использовать отладчик, чтобы проверить содержимое моих переменные. В приведенном выше примере после первого вызова 'strtok_r' token1 является 'M', что является правильным. Однако после второго вызова (в цикле) токен 1 становится 0x00000000 (NULL).
Если я вместо этого использовать 'strtok' вместо:
strcpy(m_cActLogLine, m_cMeasureLogLine);
token1 = strtok(m_cActLogLine, ";");
while (token1 != NULL) {
token1 = strtok(NULL, ";");
}
итерации цикла просто отлично. Но таким образом я не могу обработать две строки за раз и сравнить значения по столбцам.
В string.h функции объявлены как:
extern _ARMABI char *strtok(char * __restrict /*s1*/, const char * __restrict /*s2*/) __attribute__((__nonnull__(2)));
extern _ARMABI char *_strtok_r(char * /*s1*/, const char * /*s2*/, char ** /*ptr*/) __attribute__((__nonnull__(2,3)));
#ifndef __STRICT_ANSI__
extern _ARMABI char *strtok_r(char * /*s1*/, const char * /*s2*/, char ** /*ptr*/) __attribute__((__nonnull__(2,3)));
#endif
Нам нужно больше кода, прежде чем мы можем посоветовать вам, предпочтительно [mcve], и, конечно, * * заявления и любые применимые инициализацию переменных, участвующих. –
См. Http: // stackoverflow.com/questions/15961253/c-correct-use-of-strtok-r и сравнить с тем, что вы делаете –
(думаю, вы не передаете char ** в качестве последнего параметра strtok_r()) –