据我所知,strlcpy和strlcat被设计为安全的替代品strncpy和strncat.然而,有些人仍然认为他们不安全,只是造成不同类型的问题.
有人可以举例说明如何使用strlcpy或strlcat(即一个总是 null终止其字符串的函数)会导致安全问题吗?
Ulrich Drepper和James Antill表示这是事实,但从未提供实例或澄清这一点.
在C中,我有两个char数组:
char array1[18] = "abcdefg";
char array2[18];
Run Code Online (Sandbox Code Playgroud)
如何复制的价值array1来array2?我可以这样做array2 = array1吗?
我对以下内容感到有些惊讶.
例1:
char s[100] = "abcd"; // declare and initialize - WORKS
Run Code Online (Sandbox Code Playgroud)
例2:
char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第二种方法不起作用.它应该是自然的(它适用于其他数据类型)?有人能解释一下这背后的逻辑吗?
我想找出为什么strncpy被认为是不安全的.有没有人有关于此的任何文档或使用它的漏洞利用示例?
如果我将char*传递给函数.我想把那个char*转换为std :: string,一旦我得到我的结果,就从std :: string将它转换回char*来显示结果.
所以我需要做的步骤
如果可能的话,我可以看看如何通过引用vs一个指针来完成它(它的地址我通过值传入但是我仍然可以修改指针所指向的值.所以即使函数中指针地址的副本被破坏了我仍然看到外面的变化值.
谢谢!
查找字符串的所有排列是通过众所周知的Steinhaus-Johnson-Trotter算法.但如果字符串包含重复的字符,如
AABB,
那么可能的唯一组合将是4!/(2!*2!)= 6
实现这一目标的一种方法是我们可以将它存储在数组中,然后删除重复项.
有没有更简单的方法来修改约翰逊算法,因此我们永远不会生成重复的排列.(以最有效的方式)
似乎strncmp通常建议比strcmp,有什么优势?我认为这可能与安全有关.如果是这种情况,如果已知其中一个输入字符串是字面常量,它仍然适用"LiteralString"吗?
更新:
我的意思是在需要比较整个字符串的相同用户场景下,strncmp可以如下使用.我想知道它是否有意义.
strncmp(inputString, "LiternalString", strlen("LiternalString"));
Run Code Online (Sandbox Code Playgroud) 这似乎应该非常简单,但出于某种原因,我没有让它工作.我有一个名为seq的字符串,如下所示:
ala
ile
val
Run Code Online (Sandbox Code Playgroud)
我想取前3个字符并将它们复制到不同的字符串中.我使用命令:
memcpy(fileName, seq, 3 * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
这应该是fileName = "ala",对吧?但出于某种原因,我明白了fileName = "ala9".我正在解决这个问题fileName[4] = '\0',但我想知道为什么我会得到那个9.
注意:将seq更改为
ala
ile
val
ser
Run Code Online (Sandbox Code Playgroud)
并重新运行相同的代码,fileName成为"alaK".不再是9,但仍然是一个错误的角色.
我是初学者,我正在学习如何在C中复制字符串.
这是我刚遇到的一个问题:
每次我尝试使用"strcpy"命令从字符串1复制到字符串2时,Visual Studio 2013会给我一条错误/警告消息,说"strcpy"不安全,建议我改用strcpy_s.
你能解释一下为什么使用strcpy不安全吗?什么是strcpy的更安全的替代品?
这是我的代码:
#include<stdio.h>
#include<string.h>
main()
{
char str1[] = "Copy a string.";
char str2[15];
char str3[15];
int i;
/* with strcpy() */
strcpy(str2, str1);
/* Without strcpy() */
for (i = 0; str1[i]; i++)
str3[i] = str1[i];
str3[i] = '\0';
/* Display str2 and str3 */
printf("The content of str2: %s\n", str2);
printf("The content of str3: %s\n", str3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS我在Windows 7 64位终极版上使用Visual Studio 2013 64位终极版.感谢您的时间!
最近有一个关于SO的问题(为什么有人会使用strncpy而不是strcpy?),这是hade的答案(答案1,答案2),这使我不确定其他字符串函数的名字中带有'n',如snprintf(我一直在广泛使用).snprintf可以安全使用吗?一般来说,'n'家族的安全功能是什么?