我正试图从记录中删除最后一个逗号。我使用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输入中删除新行字符。
有人能告诉我发生了什么事吗?
最佳答案
如果你读了例如this sprintf
(and family) reference你会看到它返回它所写字符串的长度。
当您执行record += sprintf(...)
操作时,会使record
点超出新打印的字符串。这对你的循环有好处。但是,然后您直接在record
调用中使用strrchr
,而strrchr
找不到您要查找的字符,并将返回您不检查的NULL
。因此,当您取消引用whereComma
时,您将取消引用一个空指针,并具有未定义的行为和崩溃。
循环后需要重置指针:
record = asmRecord;
关于c - 使用strrchr()时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35658209/