strcpy函数导致修改不需要的变量
抱歉,如果它太基本,但我无法解决它。当我执行strcpy时,我会在它被更改后立即得到其他变量strcpy函数导致修改不需要的变量,c,C,抱歉,如果它太基本,但我无法解决它。当我执行strcpy时,我会在它被更改后立即得到其他变量 //global char incomingData[250] = {0}; //data is never exceeds 50. 然后用数据填充incomingData并 handleIncomingData(incomingData); void handleIncomingData(char *incoming) { parseGetRespondHeader(incoming)
//global
char incomingData[250] = {0}; //data is never exceeds 50.
然后用数据填充incomingData并
handleIncomingData(incomingData);
void handleIncomingData(char *incoming)
{
parseGetRespondHeader(incoming); //also strcpy strings into "incoming"
char *header = strtok (incoming,":");
char *dataA=strtok (NULL, ":");
char *dataB=strtok (NULL, ":");
if(strstr(header, PROTOCOL_SET_WIFI_CONNECTION ) != NULL)
{
if(checkConnection(dataA,dataB))
strcpy(incoming,"connected"); // REMOVING THIS LINE SOLVES IT
标记行导致其他无关指针更改其值(该行之前和之后的变量不同)
checkConnection
函数没有对dataA
和dataB
执行任何操作,这些指针并非无关。它们都指向绳子里面
指针不会更改其值。但是,如果覆盖该值,则其指向的值很容易更改
检查文档。这些指针并非无关。它们都指向绳子里面 指针不会更改其值。但是,如果覆盖该值,则其指向的值很容易更改
检查文档。您的其他指针都指向同一字符串的部分
传入的
。请记住,strtok
修改传递给它的变量
要解决此问题,只需使用
strcpy
将字符串incoming
复制到另一个字符串中,然后将该另一个字符串用于strtok
操作您的其他指针都指向同一字符串incoming
的部分。请记住,strtok
修改传递给它的变量
要解决这个问题,只需使用strcpy
将您的字符串incoming
复制到另一个字符串中,然后将另一个字符串用于strtok
操作strtok()
不会创建新的分配dataA
指向(一个过去),其中第一个“:”在传入中是,而dataB
指向(一个过去),第二个“:”是
strcpy(传入,“已连接”)
将覆盖dataA(可能还有dataB),如果您的第一个令牌(由头指向)短于strlen(“已连接”)
strtok()
未创建新分配dataA
指向(一个过去),其中第一个“:”在传入中是,而dataB
指向(一个过去),第二个“:”是
strcpy(传入,“已连接”)
将覆盖dataA(可能还有dataB),如果您的第一个令牌(由头指向)短于strlen(“已连接”)
什么指针?很抱歉,我不太清楚你的答案,因为我不明白代码有什么问题。。正在修改的指针甚至没有显示在这里。明白了,谢谢。。。我忽略了这个事实,它实际上没有创建新的数组。什么指针?很抱歉,我不太清楚你的答案,因为我不明白代码有什么问题。。正在修改的指针甚至没有显示在这里。明白了,谢谢。。。我错过了一个事实,那就是它实际上并没有创建一个新的阵列。没错!dataA真的是个问题!你能解释一下吗?哦,明白了!那么我该如何改变它呢?@Curnelious strtok不会将令牌放入新内存中。它只生成指向旧字符串中标记所在位置的指针。所以如果你使用strtok(str,,);在一个名为“str,as”的字符串上,第一个返回值将指向字符串中的“s”。第二个将指向“a”。strtok()
获取您传递给它的初始指针,并修改该内存。它将您的分隔符转换为该内存中的\0
。下一个调用返回的地址超过了上一个分隔符,并再次执行整个操作。@Curnelious只需使用strcpy
将传入内容完全复制到另一个字符串中,然后将该字符串用于strtok。没错!dataA真的是个问题!你能解释一下吗?哦,明白了!那么我该如何改变它呢?@Curnelious strtok不会将令牌放入新内存中。它只生成指向旧字符串中标记所在位置的指针。所以如果你使用strtok(str,,);在一个名为“str,as”的字符串上,第一个返回值将指向字符串中的“s”。第二个将指向“a”。strtok()
获取您传递给它的初始指针,并修改该内存。它将您的分隔符转换为该内存中的\0
。下一个调用返回的地址超过了上一个分隔符,并再次执行整个操作。@Curnelious只需使用strcpy
将传入内容完全复制到另一个字符串中,然后将该字符串用于strtok即可。