我正在尝试从记录中删除最后一个逗号。我使用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输入中删除新的行字符。
有谁能告诉我发生什么事?
答案 0 :(得分:3)
如果您阅读例如this sprintf
(and family) reference您将看到它返回它写入的字符串的长度。
当您执行record += sprintf(...)
时,您将record
点超越新打印的字符串。这对你的循环有好处。但是,您可以在record
来电中直接使用strrchr
,而strrchr
无法找到您要查找的字符,并会返回您未检查的NULL
。因此,当您取消引用whereComma
时,您将取消引用空指针并具有未定义的行为和崩溃。
你需要在循环后重置指针:
record = asmRecord;