1

这是我的反转字符串的程序。我试图在最后使用函数 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 错了吗?

4

3 回答 3

4

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

op = strrchr(rt, 'B');

if (op != NULL)
  printf("strrchr gives %c\n", *op);
于 2011-06-22T06:39:31.363 回答
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 的更多信息,请参阅

于 2011-06-22T06:42:23.687 回答
1

来自精美手册

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

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

于 2011-06-22T06:42:01.770 回答