ошибка сегментации при использовании функции strrchr - PullRequest
1 голос
/ 22 июня 2011

Вот моя программа, которая переворачивает строку.Я пытаюсь использовать функцию 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 ]

4 голосов
/ 22 июня 2011

Перед разыменованием op с унарным оператором * необходимо проверить, является ли он NULL (это будет иметь место, когда символ не найден):

op = strrchr(rt, 'B');

if (op != NULL)
  printf("strrchr gives %c\n", *op);
2 голосов
/ 22 июня 2011

Попробуйте:

#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 см. this .

1 голос
/ 22 июня 2011

Из тонкой инструкции :

После успешного завершения strrchr () возвращает указатель на байт или нулевой указатель, если c не встречается в строке.

Поскольку в rt нет 'B' при вызове strrchr(rt, 'B'), вы получаете нулевой указатель обратно, а затем пытаетесь разыменовать его при вызове printf. Отсюда и твоя ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...