使用strrchr函数的分段错误

时间:2011-06-22 06:35:23

标签: c string 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 个答案:

答案 0 :(得分:4)

在使用op一元运算符取消引用*之前,您必须检查它是否为NULL(未找到该字符时会出现这种情况):

op = strrchr(rt, 'B');

if (op != NULL)
  printf("strrchr gives %c\n", *op);

答案 1 :(得分:2)

试试这个:

#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

答案 2 :(得分:1)

来自fine manual

  

成功完成后,如果字符串中没有出现c,strrchr()将返回指向该字节的指针或空指针。

由于调用'B'rt中没有strrchr(rt, 'B'),因此您会返回NULL指针,然后尝试在printf调用中取消引用它。因此你的段错误。