gpt4 book ai didi

c - 使用 KEIL 编译器在 C 中标记多个字符串

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:52 28 4
gpt4 key购买 nike

我正在使用 Keil 编译器编写微 Controller 程序。该程序创建了几个类似 CSV 的字符串(日志行)。例如“A;001;错误;C05;...\n”为了节省空间,我现在想通过记录差异来减少数据。因此,我正在保存最后记录的行并将其与新行进行比较。如果列中的值相同,我只想忽略它。例如:"A;001;ERROR;C05;...\n"<- 上一个日志

"A;002;ERROR;C06;...\n"<- 新日志

会导致 ";002;;C06;...\n"

一开始我只是包含了<string.h>并使用“strtok”逐步浏览我的 CSV 行。因为我需要比较 2 个字符串/行,所以我需要在 2 个不同的字符串上同时使用它,但这是行不通的。所以我切换到似乎根本不起作用的“strtok_r”:

token1 = strtok_r(m_cActLogLine, ";", pointer1);
while (token1 != NULL) {
token1 = strtok_r(NULL, ";", pointer1);
}

这只会给我带来奇怪的行为。通常,对“strtok_r”的第二次调用只返回 NULL 并离开循环。那么是否有另一种方法可以实现所需的行为?

编辑:

为了澄清我的意思,这就是我目前正在努力开始工作的:我的输入 (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”,这是正确的。然而,在第二次调用之后(在循环中) token 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

最佳答案

您需要为 strtok_r() 的最后一个参数传递指向有效 char* 的指针。您将指针传递给带有 pointer1 的指针,但它是一个 NULL(因为它是一个全局范围的变量,未分配值),所以当 strtok_r() 将它的迭代指针存储在指向您传入的指针的地址处,它试图向地址 0x00000000 写入内容。

尝试...

char m_cActLogLine[MAX_SIZE_PARAM_LINE_TEXT];
char* token1;
char* pointer1;

void vLogProtocolMeasureData()
{
strcpy(m_cActLogLine, m_cMeasureLogLine);
token1 = strtok_r(m_cActLogLine, ";", &pointer1);
while (token1 != NULL) {
token1 = strtok_r(NULL, ";", &pointer1);
}

关于c - 使用 KEIL 编译器在 C 中标记多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208894/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com