Ошибка сегментации при использовании 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 ответ

Если вы читаете, например, это sprintf (и семейство) вы увидите, что он возвращает длину строки, которую он пишет.

Когда вы делаете record += sprintf(...) ты делаешь record указать за недавно напечатанную строку. Что хорошо для вашей петли. Но тогда вы используете record прямо в strrchr позвони и strrchr не может найти персонажа, которого вы ищете, и вернется NULL который вы не проверяете. Поэтому, когда вы разыграете whereComma вы будете разыменовывать нулевой указатель и иметь неопределенное поведение и ваш сбой.

Вам нужно сбросить указатель после цикла:

record = asmRecord;
Другие вопросы по тегам