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

 更新时间:2017年01月11日 15:18:11   作者:PHPor  
这篇文章主要介绍了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语言算法实现,也是ACM当中经常会引用到的基础题目,文中共介绍了三种C语言解答,需要的朋友可以参考下
    2015-08-08
  • C/C++宏替换实现详解

    C/C++宏替换实现详解

    这篇文章主要介绍了C/C++宏替换实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • VS2019安装配置MFC(安装vs2019时没有安装mfc)

    VS2019安装配置MFC(安装vs2019时没有安装mfc)

    这篇文章主要介绍了VS2019安装配置MFC(安装vs2019时没有安装mfc),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 新手小心:c语言中强符号与弱符号的使用

    新手小心:c语言中强符号与弱符号的使用

    本篇文章适合新手。是对c语言中强符号与弱符号的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++指针和取地址的方法

    C/C++指针和取地址的方法

    C/C++指针和取地址的方法,需要的朋友可以参考一下
    2013-04-04
  • opencv3/C++ 离散余弦变换DCT方式

    opencv3/C++ 离散余弦变换DCT方式

    今天小编就为大家分享一篇opencv3/C++ 离散余弦变换DCT方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言实现单词助手功能

    C语言实现单词助手功能

    这篇文章主要为大家详细介绍了C语言实现单词小助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++11 模板参数的“右值引用”是转发引用吗

    C++11 模板参数的“右值引用”是转发引用吗

    这篇文章主要介绍了C++11 模板参数的“右值引用”是转发引用吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • VS2019配置opencv详细图文教程和测试代码的实现

    VS2019配置opencv详细图文教程和测试代码的实现

    这篇文章主要介绍了VS2019配置opencv详细图文教程和测试代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 解决不用sizeof求出int大小的方法

    解决不用sizeof求出int大小的方法

    本篇文章是对不用sizeof求出int大小的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论