Ошибка сегментации при использовании функции strrchr
Вот моя программа, которая переворачивает строку. Я пытаюсь использовать функцию strrchr в конце, потому что я ввожу строку James Bond
на стандартном вводе. Поэтому я хочу посмотреть, если функция strrchr дает указатель на значение символа B
вышеуказанной строки.
#include<stdio.h>
#include<string.h>
int main ()
{
char rt[100];
char temp,*op;
printf("enter a string\n");
scanf("%s",rt);
printf("the string you entered is %s\n",rt);
int i, k, length;
i=0;
k=strlen(rt);
printf("strlen gives =%d\n",k);
length=k;
length--;
for(;i<k/2;i++)
{
temp=rt[i];
rt[i]=rt[length-i];
rt[length-i]=temp;
}
printf("the reverse string is %s\n",rt);
op=strrchr(rt,'B');
printf("strrchr gives %c\n",*op);
}
Теперь, когда я бегу выше, я получаю
./a.out
enter a string
James Bond
the string you entered is James
strlen gives =5
the reverse string is semaJ
Segmentation fault
Что может быть причиной этого. Является ли выше использование strrchr неправильно?
3 ответа
Попробуй это:
#include<stdio.h>
#include<string.h>
int main ()
{
char rt[100];
char temp,*op;
printf("enter a string\n");
fgets(rt, 100, stdin);
printf("the string you entered is %s\n",rt);
int i,k,length;
i=0;k=strlen(rt);
printf("strlen gives =%d\n",k);
length=k;
length--;
for(;i<k/2;i++)
{
temp=rt[i];
rt[i]=rt[length-i];
rt[length-i]=temp;
}
printf("the reverse string is %s\n",rt);
op=strrchr(rt,'B');
printf("strrchr gives %c\n",*op);
return 0;
}
scanf %s
принимает только небелые пробелы. Так James Bond
не полностью прочитан. fgets
хорошо работает и должен быть предпочтительным для пользовательского ввода.
Более подробную информацию о scanf, gets и fgets смотрите в этом.
Перед разыменованием op
с *
унарный оператор, вы должны проверить, является ли это NULL
(это будет случай, когда персонаж не найден):
op = strrchr(rt, 'B');
if (op != NULL)
printf("strrchr gives %c\n", *op);
После успешного завершения strrchr() возвращает указатель на байт или нулевой указатель, если c не встречается в строке.
Так как нет 'B'
в rt
когда ты звонишь strrchr(rt, 'B')
, вы получаете нулевой указатель обратно, а затем вы пытаетесь разыменовать его в вашем printf
вызов. Отсюда и твой сегмент.