我正试图从记录中删除最后一个逗号。我使用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/

10-12 16:15