这是我用来颠倒字符串的程序。我尝试在最后使用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用法是错误的吗?
发布于 2011-06-22 14:42:24
试试这个:
#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。
发布于 2011-06-22 14:39:31
在使用*一元运算符解引用op之前,必须检查它是否为NULL (如果找不到字符,就会出现这种情况):
op = strrchr(rt, 'B');
if (op != NULL)
printf("strrchr gives %c\n", *op);发布于 2011-06-22 14:42:02
从fine manual
成功完成后,strrchr()将返回指向该字节的指针,如果字符串中没有出现c,则返回空指针。
由于在调用strrchr(rt, 'B')时rt中没有'B',因此会得到一个空指针,然后在printf调用中尝试取消对它的引用。这就是你的段错的原因。
https://stackoverflow.com/questions/6435847
复制相似问题