C语言使用strcat_s拼接字符串以及“string is not null terminated“解决办法

C语言实现字符串拼接

本文使用VS2019软件,使用C语言实现字符串拼接以及中间出现的一些问题


文章目录

  • C语言实现字符串拼接
  • 前言
  • 一、字符串拼接函数stract
  • 二、字符串拼接函数strcat_s
  • 三、"string is not null terminated"解决办法
  • 四、程序和结果
  • 总结

前言

提示:最近在研究格雷码的实现,本来准备用C语言先实现一,但是在C语言实现的过程中需要进行字符串拼接,于是写了一个demo实现字符串的拼接,但是在实现的过程中出现了一点问题,于是写了这篇博客进行记录

一、字符串拼接函数stract
以下操作需要包含头文件为:

1
2
3
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

既然是使用C语言实现字符串拼接,那肯定会想到使用strcat函数,该函数的定义如下:

1
char * strcat ( char * destination, const char * source );

它将source字符串拼接到destination字符串的末尾,示例如下:

1
2
3
4
char* str1={<!-- -->"000"};
char* str2={<!-- -->"001"};
strcat ( str2, str1 );  //str1被拼接到了str2的结尾,结果为001000
strcat ( str1, str2 );  //str2被拼接到了str1的结尾,结果为000001

但是在使用的过程中VS2019会报错,显示strcat不安全,建议使用strcat_s。于是接下来就只好使用strcat_s代替了。

二、字符串拼接函数strcat_s

strcat_s的定义为:

1
2
3
4
5
errno_t strcat_s(
   char *strDestination,
   size_t numberOfElements,
   const char *strSource
);

其中strDestination是以Null结尾的目标字符串缓冲区。
numberOfElements是目标字符串缓冲区大小。
strSource是以Null结尾的源字符串缓冲区。

使用示例:

1
strcat_s(str, num,str1);

当然以上代码的变量需要先声明。

在了解之后对程序直接进行了修改(此为错误示范,请勿复制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() {<!-- -->
    char* a = NULL;
    char* str1 = {<!-- -->"000"};
    char* str2 = {<!-- -->"001"};
    int num;

    num = strlen(str1)+ strlen(str2) + 1;
    char* str = (char*)malloc(num*sizeof(char));
    strcat_s(str, num,str1);
    strcat_s(str, num,str2);

    printf("%s", str);

    return 0;
}

此方法可能大佬已经看出来有什么不妥了,但是当时我并不知情,直接点击运行按钮,结果运行的过程中报错了,错误为:在这里插入图片描述

三、"string is not null terminated"解决办法

遇到问题不要惊慌,直接看一遍大致问题,但是也没有理解,便去上网找寻答案。

在找寻后发现问题出在了str进行初始化分配空间的时候使用的是malloc函数,而使用这个函数进行动态空间分配的时候只是分配了内存空间,但是对内存空间中的内容并没有进行初始化。上文我们提到了使用strcat_s函数时的目的字符串和源字符串都需要以NULL结尾,这就是问题所在。

于是我们使用了另一个动态分配空间的函数calloc,该函数在进行动态空间分配的时候使用会将分配的空间初始化为0,这样就可以正常运行了。

注:malloc和calloc函数定义:

1
2
3
void* malloc(size_t size);  //malloc()函数不会初始化声明的内存

void* calloc(size_t num, size_t size); //calloc()函数声明内存并将它们初始化为0

四、程序和结果

程序如下(头文件在上文已经给出):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {<!-- -->
    char* a = NULL;
    char* str1 = {<!-- -->"000"};
    char* str2 = {<!-- -->"001"};
    int num;

    num = strlen(str1)+ strlen(str2) + 1;
    char* str = (char*)calloc(num, sizeof(char));
    strcat_s(str, num,str1);
    strcat_s(str, num,str2);

    printf("%s", str);
    free(str);

    return 0;
}

程序运行结果如下:
在这里插入图片描述

总结

本文使用C语言实现字符串的拼接,并详述了strcat()函数、strcat_s()函数、malloc()函数和calloc()函数的使用方法,希望可以给各位带来启发,不足之处还请各位批评指正。