c语言的字符与字符串拼接,详解C语言中的字符串拼接(堆与栈)
首先来看一个demo:
int do_sth(int type) {
char *errstr;
switch(type) {
case 1:
errstr = "Error";break
case 2:
errstr = "Warn";break
case 3:
errstr = "Info";break
case 4:
errstr = "Debug";break
default:
return 0;
}
if (...) {..}
if (...) {
..;
fprintf(stdout, "%s %s", errstr, ...);
return 1;
}
if (...) { return 1;}
if (...) {
fprintf(stderr, "%s %s", errstr, ...);
}
...
return 0;
}
问题: 如何在errstr信息前面添加一个HOSTNAME 环境变量信息?
考虑到errstr有可能写到标准错误,也有可能写到标准输出,也有可能根本就不输出,所以,提前输出HOSTNAME 信息显然不合适
考虑到引用errstr的地方确实不少,最好一开始就拼接HOSTNAME到该errstr 上面去,那么如何拼接呢?
如果是在脚本语言或者带有gc的语言中,完全可以直接在errstr变量前面拼接那个动态获取到的环境变量,如:
errstr=getenv("HOSTNAME") + errstr ;
但是c中却不能这样,为什么呢?字符串拼接的函数不是有的吗,如:strcat;
事实却并非如此简单,为什么呢?
上面的errstr变量是存储在栈上的,不需要考虑free的问题,原作者考虑到后续一大堆复杂的if分支,如果把errstr放在堆上,处处要考虑是不是该把errstr free掉,得死多少脑细胞啊!
对于HOSTNAME是个运行时的信息,显然没法放到栈上,如果非要和errstr拼接起来的话,errstr必须在堆上,即要动态的malloc,由此可见,对于脚本语言来讲,一个非常简单的逻辑,在C中却如此的麻烦
解决办法:
为了既不需要free,又能拼接字符串,可以定义一个字符数组,如: errstr[255],然后,把需要的信息加进去;为了避免信息太多而不小心越界,可以使用snprintf函数,自动丢弃超长的部分
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
c语言的字符与字符串拼接,详解C语言中的字符串拼接(堆与栈)相关推荐
- c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用
详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...
- c语言中截取字符串 sub,详解C++ string常用截取字符串方法
string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos) ...
- c语言中文字符串数组,详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...
- c语言中的字符串数组,详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...
- php字符串类型详解,php数字类型之字符串类型详解
在php中可字符一个字符串我们常用的就是单引号和双引号以前后面的语法结构heredoc和nowdoc定义,这两个要在php5.3.0以上版本. PHP中一个字符串可以通过下面的4种方式来定义: 单引号 ...
- php字符串类型详解,php数字类型之字符串类型详解_PHP教程
在php中可字符一个字符串我们常用的就是单引号和双引号以前后面的语法结构heredoc和nowdoc定义,这两个要在php5.3.0以上版本. PHP中一个字符串可以通过下面的4种方式来定义: 单引号 ...
- c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区
决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...
- c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件! 如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更 ...
- C语言自动类型转换和强制类型转换详解,C语言强制类型转换 - 地狱的烈火的个人页面 - OSCHINA - 中文开源技术交流社区...
C语言中的类型转换 C语言中的类型转换有两种,自动与强制. 它们都有几种情况,如不同长度的转换:不同类型的转换:还有无符号与有符号数之间的转换.关键是两点,即长度不同时如何转换,在有无符号数参与时如何 ...
- VIM查找和替换字符串命令详解(持续更新中...)
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian ...
最新文章
- 数据通信技术(一:IP划分)
- Vue 踩坑之旅(1)
- JS获取鼠标位置,兼容IE FF
- LR在安装和卸载问题上的一点总结(转帖)
- MySQL数据库:explain执行计划详解
- 把CheckBox的方块换成图片或其他
- 蓝桥杯 ALGO-42 算法训练 送分啦
- 用yacc编写的算术运算计算器_10天学会四则运算小计算器设计之第5天
- python安装request失败_在python 虚拟环境下使用命令pip install -r request 安装软件失败?...
- rgba通道转rgb_JS实现颜色的10进制转化成rgba格式的方法
- 手机屏碎了,怎样辨别是外屏坏还是内屏坏,看完这篇文章就明白了
- 接口测试, 功能测试(黑盒测试)
- linux新建/删除子接口
- 小程序中实现搜索功能
- ROS 发布消息和订阅消息 for Python
- UEFI与BIOS、GPT与MBR的区别
- 臻图信息构建数字孪生港口船舶停靠管理系统,赋能港口创新发展
- Text to image论文精读GR-GAN:逐步细化文本到图像生成 GRADUAL REFINEMENT TEXT-TO-IMAGE GENERATION
- RealView MDK开发工具
- java8 无限流_java – “有效无限流”是什么意思