繁体   English   中英

C中的字符串串联

[英]String concatenation in C

char *str1 = malloc(256*sizeof(char));
char *str2 = "stack"
for (i=0;i<15;i++){
     sprintf(str1,"%s%s",str1,str2);
} 
printf("%s\n",str1);

我正在尝试在每次循环计数时将str2连接到str1。 但是此代码段有效但易受攻击。 吸引他们的最佳方法是什么?

根据CERT安全编码指南, 在引用字符串文字时 ,需要使用指向const的指针

因此, char *str2 = "stack"需要为const char *str2 = "stack";

这将使其不变。

此外,您正在使用不推荐使用/过时的功能 您应该使用的安全功能是strcat_s 例如,

符合例

enum { BUFFERSIZE=256 };

void complain(const char *msg) {
  static const char prefix[] = "Error: ";
  static const char suffix[] = "\n";
  char buf[BUFFERSIZE];

  strcpy_s(buf, BUFFERSIZE, prefix);
  strcat_s(buf, BUFFERSIZE, msg);
  strcat_s(buf, BUFFERSIZE, suffix);
  fputs(buf, stderr);
}

在这里阅读有关strcpy_s()和strcat_s()的信息

字符串连接的标准C函数是char * strncat ( char * destination, char * source, size_t num );

如果要使用sprintf 像这样的东西:

char *str1 = malloc(256*sizeof(char));
char *str2 = "stack";
*str1 = '\0';
for (i=0;i<15;i++){
    snprintf(str1 + strlen(str1), 256 - strlen(str1), "%s", str2);
} 
printf("%s\n",str1);

使用strncat

char *str1 = malloc(256*sizeof(char));
str1[0] = '\0';
char *str2 = "stack"
for (i=0;i<15;i++){
     strncat(str1, str2, 256 - 1 - strlen(str2));
} 
printf("%s\n",str1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM