我正在尝试对字符串进行标记,并插入一个标记作为键,其余作为地图的值。但插入时,我遇到了分段错误。我调试了很长时间但无法找到克服此错误的方法。这是我的代码:
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;
}
}
任何帮助将不胜感激!
答案 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;
}
}