0

我正在尝试从记录中删除最后一个逗号。我使用 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 输入中删除换行符。

谁能让我知道发生了什么事?

4

1 回答 1

3

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

当您这样做时,record += sprintf(...)您会record指出新打印的字符串之外的内容。这对你的循环有好处。但是然后您record直接在strrchr调用中使用,并且strrchr找不到您要查找的字符并将返回NULL您不检查的字符。因此,当您取消引用时,whereComma您将取消引用空指针并具有未定义的行为和崩溃。

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

record = asmRecord;
于 2016-02-26T17:45:24.893 回答