重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先要明白一点儿,C语言中字符串也是按一个一个字符存在""字符数组""中的哦! 用个数组作为队列来存放
你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事成都网站设计、做网站、企业网站建设、成都手机网站制作、网页设计、品牌网站建设、网页制作、做网站、建网站。创新互联公司拥有实力坚强的技术研发团队及素养的视觉设计专才。
例如:int a[100] 将这个数组用在你要接收字符的函数里,将接收的字符按i递增存放在a[]里
接收时用个for(i=0;i++;i=100)
{
a[i]=接收字符
}
这样a[0]里装的是第一个接收字符,a[1]是第二个,依次类推,字符串就被接收到a[]里了
输出时同理再用个for循环就可以了,例如
for(i=0;i++;i=100)
{
printf a[i]
}
当然要返回的字符串若是要用在其它的函数里也可以再定义个变量例如temp
可以temp=a[i]反正整个字符串都被保存在了数组a[]里,想怎么用可以了!
以上只是算法,具体代码还得根据自己需要多动手训练哦!
野指针的含义:超出生命周期的指针,包括函数内局部数据的指针(static修饰数据除外,它不在栈上)和已经被释放了的动态分配内存区。
char *Getstr(void)
{
char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
这个函数,是将栈内局部变量的地址返回给调用者,调用者拿到的指针属于典型的超出生命周期的指针,对它的使用会不会引起错误,依赖于进一步的操作,本身行为就是不可预期的。
可以认为:使用strcpy和printf并没有破坏这个内存区域,即没有对这部分内存做修改,因此运行可以得到你期待的结果。但puts的运行修改了这部分内存区,导致你看到的都是乱码。
避免野指针带来的不确定性:
你可以使用
char *Getstr(void)
{
static char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
用这个函数,你的所有逻辑都不变。
或者
char *Getstr(void)
{
char *s = malloc(80);
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
要记得在这个调用后得到的ptr,一定要用free(ptr)。
要返回字符串 需要返回char*类型
需要注意的是 返回的字符串 不能是该函数的局部变量,否则会导致出错
可以是参数字符串,全局变量,静态局部变量,或者动态分配的内存
比如
char *my_str_cpy(char *d, char *s)
{
char *p=d;
while(*p++=*s++);
return d;//返回参数字符串。
}
C语言返回字符串有四种方式:1。使用堆空间,返回申请的堆地址,注意释放2。函数参数传递指针,返回该指针3。返回函数内定义的静态变量(共享)4。返回全局变量使用分配的内存,地址是有效 \x0d\x0achar *fun() \x0d\x0a{ \x0d\x0achar* s = (char*)calloc(100, sizeof(char*) ); \x0d\x0aif (s) \x0d\x0astrcpy ( s , "abc " ); \x0d\x0areturn s; \x0d\x0a} \x0d\x0a但这种方式需要注意,必须由使用将将返回的地址free掉 \x0d\x0a\x0d\x0a将地址由入参传入 \x0d\x0achar* fun(char*s) \x0d\x0a{ \x0d\x0aif (s) \x0d\x0astrcpy(s, "abc "); \x0d\x0areturn s; \x0d\x0a} \x0d\x0a这种方式调用都要注意给s分配的大小是足够。 \x0d\x0a可以这样: \x0d\x0achar* fun(char*s, int len) \x0d\x0a{ \x0d\x0aif (s) \x0d\x0a{ \x0d\x0astrncpy(s, "abc ", len-1); \x0d\x0as[len-1] = 0; \x0d\x0a} \x0d\x0areturn s; \x0d\x0a} \x0d\x0a\x0d\x0a或才使用局部静态变量 \x0d\x0achar* fun() \x0d\x0a{ \x0d\x0astatic char s[100]; \x0d\x0astrcpy(s, "abc "); \x0d\x0areturn s; \x0d\x0a} \x0d\x0a这种方式需要注意,不要修改返回的这个字符串,由于是共享地址,对它的修改会反应到每个调用者的。可以这样: \x0d\x0aconst char* fun() \x0d\x0a{ \x0d\x0astatic char s[100]; \x0d\x0astrcpy(s, "abc "); \x0d\x0areturn s; \x0d\x0a} \x0d\x0a\x0d\x0a还有一种是使用全局变量 \x0d\x0achar g_s[100]; \x0d\x0achar* fun() \x0d\x0a{ \x0d\x0astrcpy(g_s, "abc "); \x0d\x0areturn s; \x0d\x0a} \x0d\x0a同样的,也要注意这个变量可存储的最大空间。