这是我的程序,它反转一个字符串。我试图在最后使用函数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错了吗?
答案 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
调用中取消引用它。因此你的段错误。