首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strrchr函数使用中的分段故障

strrchr函数使用中的分段故障
EN

Stack Overflow用户
提问于 2011-06-22 14:35:23
回答 3查看 1.1K关注 0票数 1

这是我用来颠倒字符串的程序。我尝试在最后使用strrchr函数,因为我在标准输入上输入了字符串James Bond。所以我想看看strrchr函数是否给出了指向上面字符串的值字符B的指针。

代码语言:javascript
复制
#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);
}

现在,当我在上面跑的时候,我得到

代码语言:javascript
复制
./a.out 
enter a string
James Bond
the string you entered is James
strlen gives =5
the reverse string is semaJ
Segmentation fault

这是什么原因呢?上面的strrchr用法是错误的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-22 14:42:24

试试这个:

代码语言:javascript
复制
#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、get和fgets的更多信息,请参阅this

票数 2
EN

Stack Overflow用户

发布于 2011-06-22 14:39:31

在使用*一元运算符解引用op之前,必须检查它是否为NULL (如果找不到字符,就会出现这种情况):

代码语言:javascript
复制
op = strrchr(rt, 'B');

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

Stack Overflow用户

发布于 2011-06-22 14:42:02

fine manual

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

由于在调用strrchr(rt, 'B')rt中没有'B',因此会得到一个空指针,然后在printf调用中尝试取消对它的引用。这就是你的段错的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6435847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档