有些时候我们需要函数返回一个字符串但是总不能定义一个字符串函数吧?所以,这里介绍几种方法让函数返回字符串。

方法一:全局变量

全局变量是最简单的方法,如例子:

#include <stdio.h>char chName[20];void DoName()//使用全局变量的话就不必要设定函数类型了
{//对chName的操作...return;
}int main()
{DoName();//执行对chName的操作puts(chName);//输出chName的值
}

这种做法虽然函数不返回任何东西,但是作用是一样的。
注意:不推荐使用太多全局变量

方法2:指针和malloc动态分配空间

PS:关于malloc的用法介绍 https://blog.csdn.net/ZouHuiDong/article/details/90415482
如果不使用全局变量,我们同样可以定义一个指针类型的函数:

char *DoName()

然后返回一个指针(假设在函数中定义char *chName):

return chName;

但是并不是这么简单,因为函数所定义的变量在函数结束时就清空了,函数里的变量在函数外面不能用。函数定义的变量存储在系统中的栈里,当函数没有运行时,栈是这样的:

栈顶-> 程序的其它信息…

开始调用函数时:

栈顶-> char *DoName
程序的其它信息…

执行到char *chName:

栈顶-> char *chName
char *DoName
程序的其它信息…

当函数结束时:

char *chName
char *DoName
栈顶-> 程序的其它信息…

此时,函数已经结束,函数定义的变量都从弹出了,没有了。而这时要是返回一个指针:

return chName;

要知道,指针,就是指向空间中的某个区域,而不是自身有值,如果函数结束了,返回一个指针,指针仍然指向函数那块已经清空的区域,那么就相当于返回的是空。如:

栈【函数运行中】
栈顶-> 指针指向-> char *chName
char *DoName
程序的其它信息…
栈【函数结束,函数定义的变量已经清空】
指针指向-> char *chName【这里已经是空的了】
char *DoName
栈顶-> 程序的其它信息…

那么这时,返回这个指针指向的区域,一块空的空间,那就没有起到作用。
那么,如何解决呢?
有请主角malloc出场!!
可以用malloc给*chName专门申请一块空间

chName = (char*)malloc(20);//给chName申请20的空间,相当于char chName[20]

那有人可能会问了,那这不还是一样的吗?
这可不一样,一般在函数中定义的变量在函数结束后在别的地方就用不了了,值被清空了。但是,用malloc申请的空间,不像函数一样,放在栈里,而是放在一个堆里,需要free才能清空。如:

  • 函数未运行
栈顶-> 程序的其它信息…
  • 函数开始运行
栈顶-> char *DoName
程序的其它信息…
  • 函数运行中
栈顶-> chName = (char*)malloc(20)
char *chName
char *DoName
程序的其它信息…
  • 函数创建好了变量chName且申请过了空间,申请的空间在堆里。
栈顶-> …
chName = (char*)malloc(20)
char *chName
char *DoName
程序的其它信息… 指针指向-> …(一些值)
  • 函数结束了,函数创建的变量都清空了,但是堆需要free来清空,但是没有使用free(),堆没有清空。
chName = (char*)malloc(20)
char *chName
char *DoName
栈顶-> 程序的其它信息… 指针指向-> …(一些值)

这时,函数返回了指针*chName,它指向堆中的某个区域,而不是已经清空的栈。主函数接收到这个指针,成功地从堆中得到了值:

char *DoName()
{...char *chName;chName = (char*)malloc(20);...return chName;
}int main()
{char getName[20] = DoName();puts(getName);return 0;
}

这样就可以了。

错误的做法

注意了: 有人会觉得我返回一个字符串不就好了吗,干嘛像方法2这么麻烦呢?
错误的代码:

char *DoName()
{char chName[4] = {'D','a','v','\0'};return chName;
}int main()
{char getName[4] = DoName();puts(getName);return 0;
}

这样,貌似……也能得到值“Dav”啊("\0"是在字符串中表示字符串结束的符号)。
其实,这只是恰好程序没有别的要处理,没有清空栈罢了!现在可以得到,但在别的地方不一定能得到。如果你让程序处理一些东西的话,就得不到值了,所以,不要使用这种错误的做法。

C语言函数如何返回字符串相关推荐

  1. 切割字符串长度php,C++_C语言中计算字符串长度与分割字符串的方法,C语言strlen()函数:返回字符串 - phpStudy...

    C语言中计算字符串长度与分割字符串的方法 C语言strlen()函数:返回字符串的长度头文件: #include strlen()函数用来计算字符串的长度,其原型为: unsigned int str ...

  2. 为什么C语言函数不能返回数组,却可以返回结构体?

    C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void)[8] { char ret; // ...fill... return ret; } in ...

  3. 为什么C语言函数不能返回数组,却可以返回结构体

    C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void[8]{ char ret;// ...fill... return ret; }int ma ...

  4. java返回字符数组_JAVA语言实现随机返回字符串数组中的字符串

    本文主要向大家介绍了JAVA语言实现随机返回字符串数组中的字符串,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. //随机返回字符串数组中的字符串 public static Stri ...

  5. C语言strlen()函数:返回字符串的长度

    转载自https://www.cnblogs.com/chenduzizhong/p/6032496.html 头文件:#include <string.h> strlen()函数用来计算 ...

  6. C语言函数不能返回局部变量的地址

    在C中,正常情况下,我们只能从函数中返回一个值.但在很多情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务.这里是一个示例.这个程序使用一个整型数组作为参数,并将数组元素的 ...

  7. python中input函数的返回是哪种类型_Python3.x中input的变化:input函数默认返回字符串类型...

    背景:学习<Python基础教程第2版>,第10.3章 标准库:一些最爱 时, 运行如下例子: 用户选择投掷的骰子数以及每个骰子具有的面数,随机返回骰子的点数,代码如下: from ran ...

  8. mysql函数第一次返回字符串_Mysql字符串处理函数详细介绍、总结

    一.简明总结 ASCII(char) 返回字符的ASCII码值 BIT_LENGTH(str) 返回字符串的比特长度 CONCAT(s1,s2-,sn)   将s1,sn连接成字符串 CONCAT_W ...

  9. c语言 电梯调度,c语言函数如何返回两个值或多个值(结合 小飞 电梯调度算法)...

    正常思维:使用return 语句,但每调用一次函数 return 语句只能返回一个值 .这是C语言语法规则. 该怎么实现一个函数返回两个值或是多个值?,可以采用"间接方法".大概有 ...

最新文章

  1. 联想正遭遇第四道坎 柳传志对症下药
  2. 【转】Pycharm创建py文件时自定义头部模板
  3. 网站后台中对html标签的处理
  4. java: 程序包com.github.pagehelper不存在_Rust语言正在兴起,Java、Python、C的末日来临?...
  5. Python把PDF文件中每页内容分离为独立图片文件
  6. 40万预算X3 glc q5买哪个好?
  7. 数据库表设计必需元素_HTML5输入,必需,模式,数据列表
  8. linux系统文件系统个目录介绍,关于linux的文件系统目录详细介绍
  9. 重装XP后无法启动LINUX的解决方案
  10. J2EE学习总结(五)------用户登录界面设计
  11. python 电路仿真spice_电路仿真SPICE入门
  12. 【实战项目惜时App项目总结分析】Vue-cli3+Vant UI+Vue-element-admin+Egg.js+Mysql
  13. 演进:如何用练习快速提升技术
  14. jsx怎么往js里传参数_JSX详解
  15. 无需软件,笔记本自带wifi功能,几条命令轻松搞定
  16. php revel,Revel 概念
  17. 操作系统复习之OS的运行环境
  18. html边框阴影咋设置,css阴影边框怎么设置
  19. static final常量变量的正确书写规范
  20. 【转】 HtmlUnit简介

热门文章

  1. Fcitx──小企鹅输入法---Ubuntu input method
  2. 拿什么奉献给你,我的敏感信息(转)
  3. TypeScript极速完全进阶指南-2中级篇
  4. 十二、实战底部(二)
  5. 如何使普通用户授权加入域的权限个数多于十个
  6. linux 重启21端口命令,修改SSH默认远程端口为21号端口
  7. 24个整点报时_大连交通广播整点报时广告怎么做?大连交通广播全新广告价格...
  8. 一点关于MD5计算的封装
  9. 2分钟-实现开机nginx开机自启动脚本(shell篇)
  10. Weaveworks增加发布自动化和事件管理