strcpy函数导致修改不需要的变量

strcpy函数导致修改不需要的变量,c,C,抱歉,如果它太基本,但我无法解决它。当我执行strcpy时,我会在它被更改后立即得到其他变量 //global char incomingData[250] = {0}; //data is never exceeds 50. 然后用数据填充incomingData并 handleIncomingData(incomingData); void handleIncomingData(char *incoming) { parseGetRespondHeader(incoming)

抱歉,如果它太基本,但我无法解决它。当我执行strcpy时,我会在它被更改后立即得到其他变量

//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即可。