C 即使IF语句为false,字符指针数组也会被重写

C 即使IF语句为false,字符指针数组也会被重写,c,pointers,typedef,C,Pointers,Typedef,我正在用指定的分隔符分解字符串,并试图根据第一个字符串修改typedef结构。我意识到,当我单步执行代码时,即使if语句为false,typedef结构也会被重写。我希望它保留以前for循环迭代中的旧值,但它没有。 我还考虑创建保存str值的局部字符变量,以便相应地更新它们,并将它们的值分配给coordtypedef。但我似乎创造了太多的变量 我希望typedef仅在字符串以某个字符串开头时更新标题。否则,打印headingPrev中可用的内容 typedef结构{ 字符*utc; 字符*lat

我正在用指定的分隔符分解字符串,并试图根据第一个字符串修改
typedef
结构。我意识到,当我单步执行代码时,即使if语句为false,
typedef
结构也会被重写。我希望它保留以前for循环迭代中的旧值,但它没有。
我还考虑创建保存str值的局部字符变量,以便相应地更新它们,并将它们的值分配给
coord
typedef。但我似乎创造了太多的变量

我希望
typedef
仅在字符串以某个字符串开头时更新标题。否则,打印headingPrev中可用的内容

typedef结构{
字符*utc;
字符*lat;
char*lat_dir;
char*lon;
char*lon_dir;
字符*速度单位kn;
字符*标题;
}协调HandleTypeDef;
常量字符*str_gprmc[7]={
“$GPRMC,125812.50,A,5741.1245547,N,01158.9460229,E,10.324207.1270319,0.0,E,A*0F”,
“$GPRMC,130019.00,A,5741.5393572,N,01158.6608248,E,14.01331.8270319,0.0,E,A*0F”,
“$GPRMC,130019.50,A,5741.5414303,N,01158.6591608,E,15.498331.8270319,0.0,E,A*07”,
“$GPHDT,3.0979,T*01”,
“$GPRMC,130132.00,A,5741.6055487,N,01158.3862843,E,9.536174.0270319,0.0,E,A*35”,
“$GPRMC,130132.50,A,5741.6042334,N,01158.3862498,E,10.783172.1270319,0.0,E,A*00”,
$GPHDT,357.8596,T*06
};
CoordinateHandleTypeDef coord={0};
//循环输入每个字符串。模仿USART结束行…然后处理字符串
//我们将保持航向参数不在循环中,以便仅在数据可用时更新
//这是因为根据数据表,其已更新一次。i、 e当检测到航向不匹配时
char*headingPrev=NULL;
uint8_t*str[8]={NULL};
uint8_t temp[50]={NULL};
对于(大小k=0;k<数组大小(str\u gprmc);k++)
{
大小\u t maxStorableTokens=0;
//将字符串存储在局部变量中,以避免读/写操作的访问冲突异常
strcpy(温度,str_gprmc[k]);
对于(uint8_t*ptr_令牌=strtok(temp,“,”);ptr_令牌;ptr_令牌=strtok(NULL,“,”))
{
如果(maxStorableTokens>=0x08)中断;
str[maxStorableTokens++]=ptr_令牌;
}
//如果索引[0]处的字符串为$GPRMC
if(strcmp(str[0],“$GPRMC”)==0)
{
coord.utc=str[1];
coord.lat=str[3];
coord.lat_dir=str[4];
coord.lon=str[5];
coord.lon_dir=str[6];
坐标速度_kn=str[7];
协调航向=航向上;
}
else if(strcmp(str[0],“$GPHDT”)==0)
coord.heading=headingPrev=str[1];
//每次循环后打印出cood的更新内容
printf(“UTC:%s,\tLONG:%s,\tLONG\u DIR:%s,\tLAT:%s,\tLAT\u DIR:%s,\t速度(Kn):%s,\t编码:%s\n”,
coord.utc、coord.lat、coord.lat_dir、coord.lon、coord.lon_dir、coord.speed_kn、headingPrev);
}
你有

char* headingPrev = NULL;
    uint8_t* str[8] = { NULL };
这里headingPrev和str是指针,它们只能保存地址,不能保存实际的srings(或char数组)。 所以当你尝试的时候

coord.heading = headingPrev = str[1]; 
标题为Prev的语句仅指向str[1]。这相当于
#定义headingPrev&str[1]
,这显然不是您的意图。您需要headingPrev来保存str[1]的值,而不是其地址。所以,您需要做的是为headingPrev分配内存。如果str[1]的大小不固定,您可以执行char HeadingPrev[20]或使用malloc/calloc进行动态内存分配。然后必须使用
strcpy()
将str[1]复制到headingPrev。 所以最后的代码是

 if (strcmp(str[0], "$GPRMC") == 0)
        {
            coord.utc       = str[1];
            coord.lat       = str[3];
            coord.lat_dir   = str[4];
            coord.lon       = str[5];
            coord.lon_dir   = str[6];
            coord.speed_kn  = str[7];

            coord.heading   = headingPrev; //<---- This would still work since headingPrev would be same as &headingPrev[0] even after allocating memory
        }
        else if(strcmp(str[0], "$GPHDT") == 0) 
        {
           strcpy(headingPrev, str[1]);
            coord.heading = headingPrev; 
        }
if(strcmp(str[0],“$GPRMC”)==0)
{
coord.utc=str[1];
coord.lat=str[3];
coord.lat_dir=str[4];
coord.lon=str[5];
coord.lon_dir=str[6];
坐标速度_kn=str[7];

coord.heading=headingPrev;//什么是
^0
?你知道这样做不对吗?只需将结果与0进行比较(或者使用
,但不使用
^0
)。它是XOR的位运算符…所以strcmp()如果字符串匹配,函数将返回0。我将它们与0进行比较,以查看它们是否真正匹配…因此,XNOR是检查内容是否匹配的另一种方法。您没有意义。
x^0
is
x
…^0
不起任何作用。您无法“构建类型定义”在运行时。
typedef
纯粹是一个编译时概念。@HakimMarley可以说typedef是“编译器头脑”中的一个概念。它没有成员变量。
typedef
只是为现有类型创建另一个名称。