C - strtok做了奇怪的事

时间:2016-09-03 15:10:28

标签: c++ arrays character strtok

我使用strtok将字符串拆分成不同的部分并将它们组装成结构。这是我的代码:

object* parseJSON(size_t length, char* json, size_t jsonLen){
char *finalString = prepareJSON(json,jsonLen);

cout << finalString << "\n";

char delimiter[] = ",:";
char *token = strtok(finalString, delimiter);

object *retObj = (struct object *)malloc(length);
size_t returnObjectIndex = 0;

size_t index = 0;
bool firstTime = true;
struct object item;

while(token != NULL){
    if((index % 2) != 0){
        if(firstTime){
            item.Type = token;
            firstTime = false;
        } else {
            item.ID = token;
            retObj[returnObjectIndex] = item;
            returnObjectIndex++;
            firstTime = true;
        }
    }
    token = strtok(NULL,delimiter);
    index++;
}

return retObj;

}

这是finalString

  

类型:温度,ID:3,类型:温度,ID:1

在我看来,这个代码应该出现:

for(int n = 0; n < 5; n++){
    cout << returnObject[n].Type << " " << returnObject[n].ID << "\n";
}

为:

  

临时3   临时1

但我在控制台上得到了这个:

  

临时3   临时1   h“°Ó*°   ç

这是因为我循环了5次,即使数组中只有2个元素吗?我循环5次因为我无法获得指针中数组的元素数量(至少我认为这是不可能的)。

非常感谢任何帮助

祝你好运

编辑:这是我的prepareJSON功能:

char* prepareJSON(char* json, size_t jsonLen){
char forbiddenChars[] = {'[', '{','\"', '}', ']'};
bool isForbbidenChar = false;
char* finalString = (char*)malloc(jsonLen);
size_t finalStringIndex = 0;
for(size_t i = 0; i < jsonLen; i++){
    char c = json[i];
    isForbbidenChar = false;
    for(int k = 0; k < 5; k++){
        if(c == forbiddenChars[k]){
            isForbbidenChar = true;
            break;
        }
    }
    if(isForbbidenChar){
        continue;
    }
    else{
        finalString[finalStringIndex] = c;
        finalStringIndex++;
    }
}

return finalString;

}

和我的main函数:

int main(){
object *returnObject;
char json[] = "[{\"Type\":\"temp\",\"id\":\"3\"},{\"Type\":\"temp\",\"id\":\"1\"}]";
returnObject = parseJSON(5,json, strlen(json));
for(int n = 0; n < 5; n++){
    cout << returnObject[n].Type << " " << returnObject[n].ID << "\n";
}

}

解决方案:

我确实分配了太少的内存,改变了它:

object *retObj = (struct object *)malloc(sizeof(struct object) * length);

现在有效!

0 个答案:

没有答案