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