2016-02-26 3 views
0

Я пытаюсь удалить последнюю запятую из записи. Я использую strrchr(), чтобы найти последнее вхождение «,» в записи и установить его на нулевое завершение. По какой-то причине он не находит последнее вхождение в запятую и дает ошибку «ошибка сегментации 11».Сегментация Ошибка при использовании strrchr()

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

ли вы проверить на NULL? –

+0

У меня есть это, но все, что он делает, это остановить ошибку. Я хочу знать, почему он не распознает запятую. –

+1

*** Покажите свои данные ***. Как мы можем диагностировать проблему на «тайном» вводе? – abelenky

ответ

3

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

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

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

record = asmRecord; 
+0

Это сработало отлично! Спасибо, прояснили мою путаницу в отношении указателей на персонажей –

Смежные вопросы