使用strrchr()时的分段错误

时间:2016-02-26 17:36:18

标签: c strrchr

我正在尝试从记录中删除最后一个逗号。我使用strrchr()来查找记录中最后一次出现','并将其设置为空终止。由于某种原因,它没有找到逗号的最后一次出现并给出“分段错误11”错误。

void buildAssemblyRecord(char asmRecord[], const char* data)
{
char* record = asmRecord;
record += sprintf(record, "dc.b\t");

int i = 0;
for(i = 0; i < strlen(data); i++)
{
    record += sprintf(record, "$%.2X, ", data[i]);
}

//Remove trailing comma
char* whereComma = strrchr(record, ',');
if(whereComma != NULL)
{
    *whereComma = '\0';
}
}

理论上这应该是完美的,因为我一直使用这个方法使用常规的旧strchr从fgets输入中删除新的行字符。

有谁能告诉我发生什么事?

1 个答案:

答案 0 :(得分:3)

如果您阅读例如this sprintf (and family) reference您将看到它返回它写入的字符串的长度。

当您执行record += sprintf(...)时,您将record超越新打印的字符串。这对你的循环有好处。但是,您可以在record来电中直接使用strrchr,而strrchr无法找到您要查找的字符,并会返回您未检查的NULL 。因此,当您取消引用whereComma时,您将取消引用空指针并具有未定义的行为和崩溃。

你需要在循环后重置指针:

record = asmRecord;