标记字符串时出现分段错误

时间:2017-07-19 02:47:27

标签: c++ dictionary segmentation-fault

我正在尝试对字符串进行标记,并插入一个标记作为键,其余作为地图的值。但插入时,我遇到了分段错误。我调试了很长时间但无法找到克服此错误的方法。这是我的代码:

while (!fin.eof())
{
    char *str1;
    char buf[MAX_CHARS_PER_LINE];
    fin.getline(buf, MAX_CHARS_PER_LINE);
    str1 = new char[strlen(buf)];
    int n = 0;
    char *token[MAX_TOKENS_PER_LINE] = {};

    token[0] = strtok(buf, DELIMITER);

    if (token[0])
    {
        for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
        {
            token[n] = strtok(0, DELIMITER);
            if (!token[n]) break;
        }
    }

    // Forming str1 using the tokens here   
     strcpy(str1, token[0]);
     strcat(str1, ":");
     strcat(str1, token[1]);
     int key = atoi(token[3]);

    // Adding str1 to map
     nameId[key] = str1;
   }
}

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

经过进一步调试后,我发现了确切的问题。在将它们与str1连接之前,我没有检查令牌是否为NULL。在我强制执行该检查之后,str1总是获得一个有效值,因此插入到地图中。

这是我更新的代码:

while (!fin.eof())
{
    char *str1;
    char buf[MAX_CHARS_PER_LINE];
    fin.getline(buf, MAX_CHARS_PER_LINE);
    str1 = new char[strlen(buf)];
    int n = 0;
    char *token[MAX_TOKENS_PER_LINE] = {};

    // Enforcing NULL check for buf
    if (buf)
    {
        token[0] = strtok(buf, DELIMITER);
    }

    // Enforcing the NULL check for the tokens
    if (token[0])
    {
        for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
        {
            token[n] = strtok(0, DELIMITER);
            if (!token[n]) break;
        }

        pair<map<int, char *>::iterator, bool> result;

        // Forming str1 using the tokens here
        strcpy(str1, token[0]);
        strcat(str1, ":");
        strcat(str1, token[1]);

        // Adding str1 to map
        int key = atoi(token[3]);
        nameId[key] = str1;
    }
}