• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解C语言中的字符串拼接(堆与栈)

详解C语言中的字符串拼接(堆与栈)

作者:PHPor 字体:[增加 减小] 来源:互联网 时间:2017-05-28

PHPor 通过本文主要向大家介绍了c语言字符串详解,c语言链表详解,c语言32关键字详解,c语言指针详解,c语言题库及详解答案等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先来看一个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;
}
</div>

问题: 如何在errstr信息前面添加一个HOSTNAME 环境变量信息?

考虑到errstr有可能写到标准错误,也有可能写到标准输出,也有可能根本就不输出,所以,提前输出HOSTNAME 信息显然不合适

考虑到引用errstr的地方确实不少,最好一开始就拼接HOSTNAME到该errstr 上面去,那么如何拼接呢?

如果是在脚本语言或者带有gc的语言中,完全可以直接在errstr变量前面拼接那个动态获取到的环境变量,如:

errstr=getenv("HOSTNAME") + errstr ;
</div>

但是c中却不能这样,为什么呢?字符串拼接的函数不是有的吗,如:strcat;

事实却并非如此简单,为什么呢?

上面的errstr变量是存储在栈上的,不需要考虑free的问题,原作者考虑到后续一大堆复杂的if分支,如果把errstr放在堆上,处处要考虑是不是该把errstr free掉,得死多少脑细胞啊!

对于HOSTNAME是个运行时的信息,显然没法放到栈上,如果非要和errstr拼接起来的话,errstr必须在堆上,即要动态的malloc,由此可见,对于脚本语言来讲,一个非常简单的逻辑,在C中却如此的麻烦

解决办法:

为了既不需要free,又能拼接字符串,可以定义一个字符数组,如: errstr[255],然后,把需要的信息加进去;为了避免信息太多而不小心越界,可以使用snprintf函数,自动丢弃超长的部分

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C语言中的字符串拼接(堆与栈)
  • 基于字符串移位包含的问题详解

相关文章

  • 2017-05-28C语言实现BMP转换JPG的方法
  • 2017-05-28C语言高斯消元法的使用详解
  • 2017-05-28举例剖析C++中引用的本质及引用作函数参数的使用
  • 2017-05-28C++实现简单的希尔排序Shell Sort实例
  • 2017-05-28解析为何要关闭数据库连接,可不可以不关闭的问题详解
  • 2017-05-28C/C++中可变参数的用法详细解析
  • 2017-05-28c++大数阶乘的实现方法
  • 2017-05-28Linux c中define的用法小结
  • 2017-05-28OpenCV中C++函数imread读取图片的问题及解决方法
  • 2017-05-28C语言编程中生成随机数的入门教程

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++线程池实现方法
    • c++中虚函数和纯虚函数的作用与区别
    • C++中异常处理的基本思想及throw语句抛出异常的使用
    • C++ 中try finally关键字详解
    • C++求四个正整数最大公约数的方法
    • C及C++中typedef的简单使用介绍
    • C语言WinSock学习笔记第1/2页
    • 概率的问题:使用递归与多次试验模拟的分析
    • C++中的异常处理机制详解
    • 关于define与C 的内存

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有