- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将 strncat
与堆对象一起使用?
我试图编写一个简单的函数来将 2 个字符串连接在一起并返回结果,但是,如果不使返回缓冲区非常大(增加大约 5000 的长度)以使其不会溢出,我就无法运行它。
我可能只是错误地使用了 strncat
函数,使用堆对象而不是固定长度的字符数组。但我不知道如何用其他方式来写它。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *concatStrings(char *arg1, char *arg2) {
char *ret = malloc(strlen(arg1) + strlen(arg2));
strncpy(ret, arg1, strlen(arg1));
strncat(ret, arg2, strlen(arg2));
ret[strlen(arg1)+strlen(arg2)] = '\0';
return ret;
}
int main(int argc, char *argv[]) {
if (argc == 3) {
char *print = concatStrings(argv[1], argv[2]);
printf("\n%s", print);
free(print);
}
return 0;
}
最佳答案
对于初学者来说,函数应该这样声明
char * concatStrings( const char* arg1, const char* arg2 );
因为指针arg1
和arg2
指向的字符串在函数内没有改变。
在这个内存分配中
char *ret = malloc(strlen(arg1) + strlen(arg2));
您忘记为空终止字符 '\0'
保留内存。你必须写
char *ret = malloc( strlen(arg1) + strlen(arg2) + 1 );
在此调用中使用魔数(Magic Number) 10
strncpy(ret,arg1,10);
没有意义。
如果相反,您将编写示例
strncpy(ret,arg1,strlen(arg1));
然后下一个电话
strncat(ret,arg2,strlen(arg2));
将调用未定义的行为,因为调用 strncpy
没有将空终止字符 '\0' 附加到指针 ret
指向的字符串。
至少只写会好得多
strcpy( ret, arg1 );
在任何情况下,您的函数实现都是低效的。例如,参数 arg2
调用函数strlen
两次
char *ret = malloc(strlen(arg1) + strlen(arg2));
//...
strncat(ret,arg2,strlen(arg2));
另外 strncat
的调用也是低效的,因为该函数需要遍历整个目标字符串以找到它的终止零。
函数可以这样定义
char * concatStrings( const char* arg1, const char* arg2 )
{
size_t n1 = strlen( arg1 );
char *ret = malloc( n1 + strlen( arg2 ) + 1 );
if ( ret != NULL )
{
strcpy( ret, arg1 );
strcpy( ret + n1, arg2 );
}
return ret;
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * concatStrings( const char* arg1, const char* arg2 )
{
size_t n1 = strlen( arg1 );
char *ret = malloc( n1 + strlen( arg2 ) + 1 );
if ( ret != NULL )
{
strcpy( ret, arg1 );
strcpy( ret + n1, arg2 );
}
return ret;
}
int main(void)
{
const char *argv1 = "Hello ";
const char *argv2 = "World!";
char *print = concatStrings( argv1, argv2 );
if ( print != NULL ) puts( print );
free( print );
return 0;
}
程序输出为
Hello World!
在函数中用 memcpy
替换 strcpy
的第一次调用会更好。那就是函数也可以长这样
char * concatStrings( const char* arg1, const char* arg2 )
{
size_t n1 = strlen( arg1 );
char *ret = malloc( n1 + strlen( arg2 ) + 1 );
if ( ret != NULL )
{
memcpy( ret, arg1, n1 );
strcpy( ret + n1, arg2 );
}
return ret;
}
关于c - strncat 导致缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66688740/
我想连接两个字符串,添加一个新的随机字符,使用 strncat() 所以基本上我是这样做的: #include #include #include #define CHARACTER_RANGE
如何将 strncat 与堆对象一起使用? 我试图编写一个简单的函数来将 2 个字符串连接在一起并返回结果,但是,如果不使返回缓冲区非常大(增加大约 5000 的长度)以使其不会溢出,我就无法运行它。
如何将 strncat 与堆对象一起使用? 我试图编写一个简单的函数来将 2 个字符串连接在一起并返回结果,但是,如果不使返回缓冲区非常大(增加大约 5000 的长度)以使其不会溢出,我就无法运行它。
我正在尝试从目录中读取文件并在其他目录中的“相应”文件中写入一些信息。为了获取新文件的路径和名称,我使用 strncat 函数连接一些字符串。我的问题是,strncat 在某些字符串的开头添加了一些字
我有以下代码: struct prefix rnp; char prefix[IPV6_PREFIX_STR_MAX_LEN]; ... strncat(prefix, "/", 1); <----
很抱歉,如果这太入门级,但我尝试实现strcpystrncat()的库函数如下: #include void strncat (char *s, char *t, int n) { // mallo
我正在编写一个 Web 服务器,我在其中通过 WinSock 套接字从客户端接收数据,并将数据解析为多个部分。然后,根据找到的方法和请求的资源,我想构建一个新的数据包,我将把它发送回客户端。 我有这个
我发现 string.h 标准库中的 strncat 函数有一些奇怪的行为,希望得到一些帮助以了解发生了什么。 我的问题的症结在于我创建的一个名为 readLine 的函数,目的是将文件的行作为 ch
首先,我编写了一个简单的程序。 1 #include 2 #include 3 #include 4 5 int main() 6 { 7 char *buf
我试图在 C 编程中连接两个字符串。这是我的代码: #include #include #include int main(int argc, char const *argv[]) {
考虑这段代码: limit = sizeof(str1)-strlen(str1)-1; strncat(str1,str2,limit); 如果 str2 长度大于 limit,strncat Nu
更新:关于 char、signed char 还是 unsigned 的问题最终没有意义。在这种情况下使用 memcpy 更合适,因为它对字节不加区别地工作。 不可能是一个更简单的操作,但我似乎错过了
我的 stringNAdd 函数将复制 strncat(原始)。我不能接受数组作为参数,但可以接受指针。我想知道我的代码是否正确? 固定代码如下: #include #include using
我无法弄清楚为什么我的 g++ 编译程序在调用 strncat() 时出现段错误。 我一直在这个网站和一般的谷歌搜索上跳来跳去,发现了许多类似的问题,但还没有找到适合我的解决方案。这是更大代码的一部分
假设我有一个大小为 10 个字符的数组(memset 为 0),我将其作为目标传递给 strncat,并且在源代码中我传递一个长度为 20 个字符的字符串(空终止),现在我应该将“计数”传递为 10
抱歉,我现在修改了代码: #include #include #include void main() { int i=0; char** f=NULL;
我有一个缓冲区,我正在做很多 strncat。我想确保我永远不会溢出缓冲区大小。 char buff[64]; strcpy(buff, "String 1"); strncat(buff, "Str
我想通过使用 strtok 和 strncat 为每个单词添加字符串“ay”。但似乎有一个我找不到的地方有冲突。它只给了我输出的第一个词“Computeray”。帮助? #include #incl
我有一个程序可以在缓冲区中连接一些字符串。 我之前用过strncpy。在网上查看了一些使用 snprintf 而不是 strncat 的建议后,我切换到 snprintf。但是,我注意到这部分程序(字
我正在尝试编写必须实现库函数 strncpy、strncat 和 strncmp 版本的代码,但运行时出现 Abort trap: 6 错误。任何想法都非常感谢: #include #include
我是一名优秀的程序员,十分优秀!