根据 教程c语言进阶操作获取strchr结果前面的字符,但提示访问出错
pprogram received signal SIGSEGV, Segmentation fault
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char *a="hello";
char *p=strchr(a,'l');
char *t=(char *)malloc(strlen(p)+1);
t=strchr(p+1,'l');
// a or a[]都能创建数组,a是一个指针,指向第一个字符的地址,对a取值,a,得到的是第一个数组的值同时也是整个字符串数组,
printf("第一个找到l的字段%s\n",p);
printf("第二个找到l的字段为%s\n",t);
// 得到l前面的字符
char c=*p;
*p='\0';
char *r=0;
strcpy(r,a);
printf("l前面的字符为 %s",r);
*p=c;
return 0;
}
将*a 换成a[]结果一样
char *a="hello"; 这么写的话,a是常量指针,内容是不可以修改
只能是 char a[] = "hello";
char *r = 0; 这里指针 r 没有分配空间,后面的拷贝没地方去了,所以报错。修改见注释处,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char *a="hello";
char *p=strchr(a,'l'); //strchr()函数返回值是个指针值
char *t=strchr(p+1,'l'); //=(char *)malloc(strlen(p)+1);//这里指针 t 不需要额外分配空间。
//t=strchr(p+1,'l');
//a or a[]都能创建数组,a是一个指针,指向第一个字符的地址,对a取值,
//a,得到的是第一个数组的值同时也是整个字符串数组,
printf("第一个找到l的字段%s\n",p);
printf("第二个找到l的字段为%s\n",t);
// 得到l前面的字符
char c=*p;
*p='\0';
//char *r=0;修改 char *r = (char *)malloc(strlen(a)+1);
//strcpy(r,a); 修改
printf("l前面的字符为 %s\n",a);//修改 printf("l前面的字符为 %s",r);
*p=c;
printf("%s",a); //最后再输出 a 看看
return 0;
}