我的问题应该很简单。
我需要给一个函数一个预定义长度的char数组,但我有一个可变长度的字符指针,但不长于我的数组的长度。
这里是代码:
#define SIZE_MAX_PERSON_NAME 50
char person[SIZE_MAX_PERSON_NAME];
char* currentPerson = "John";
现在我如何让John进入person数组,同时将数组的其余部分设置为0(/ NUL)?
所以我会
BINARY DATA: "John/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL/NUL....."
在我的记忆中?
抱歉,如果这太愚蠢了,但我现在似乎无法找到解决方案。
答案 0 :(得分:3)
首先,零初始化固定大小的数组:
// Using memset here because I don't know if the whole copy operation can or will be used
// multiple times. We want to be sure that the array is properly zero-initialized if the next
// string to copy is shorter than the previous.
memset(person, '\0', SIZE_MAX_PERSON_NAME);
然后,将可变大小的字符串复制到其中:
strcpy(person, currentPerson);
如果您不确定currentPerson
是否适合person
:
strncpy(person, currentPerson, SIZE_MAX_PERSON_NAME - 1);
请注意,如果
,strncpy
也会对数组的剩余字节进行零初始化
strlen(currentPerson) < SIZE_MAX_PERSON_NAME - 1
所以你基本上有这两个选择:
memset(person, '\0', SIZE_MAX_PERSON_NAME);
strcpy(person, currentPerson);
或者:
strncpy(person, currentPerson, SIZE_MAX_PERSON_NAME - 1);
person[SIZE_MAX_PERSON_NAME - 1] = '\0';
答案 1 :(得分:2)
发布此答案后,问题从C ++重新定为C语言。
使用std::string
,如下所示:
// "using namespace std;" or "using std::string;", then:
string const person = currentPerson;
old_c_function( person.c_str() );
要做C级别的事情,我建议你不这样做,首先用一个类型化常量替换不必要的#define
:
int const max_person_name_size = 50;
然后对数组进行零初始化:
char person[max_person_name_size] = {};
(注意:这里没有傻memset
。)
(还要注意:这种归零只是一种预防措施。你想要它。但它并不是必需的,因为strcpy
将确保一个尾随的零字节。)
然后只需复制字符串:
assert( strlen( current_person ) < max_person_name_size );
strcpy( person, current_person );
但不要这样做。请改用std::string
。
更新:做了几分钟的其他事情让我意识到这个答案,就像到目前为止所有其他人一样,完全不合时宜。 OP在a comment elsewhere中说明了
“我在库中有一个只接受字符数组的函数。不是字符指针。
因此,显然这完全是一种误解。
唯一有意义的方法是,如果数组被函数修改,那么std::string::c_str()
不是解决方案。但是如果std::string
的长度设置为C函数的足够长度,则仍然可以使用person.resize( max_person_name_size );
foo( &person[0] ); // Assuming foo modifies the array.
person.resize( strlen( person.c_str() ) );
。可以这样:
{{1}}
答案 2 :(得分:0)
使用文字,你可以这样做:
char person[SIZE_MAX_PERSON_NAME] = "John";
如果c-string不是文字,则必须使用strcpy
strcpy(person, currentPerson);
答案 3 :(得分:0)
这是存在strncpy
:
将一个字符串(最多0个终止符或缓冲区结束)放入一个固定长度的数组中并将其余部分归零。
这不能确保0终止,因此避免使用其他任何内容。
7.24.2.4
strncpy
函数#include <string.h> char *strncpy(char * restrict s1, const char * restrict s2, size_t n);
2
strncpy
函数复制不超过n
个字符(跟随空的字符) 从s2
指向的数组到s1
指向的数组,不会复制字符。 308)如果在重叠的对象之间进行复制,则行为未定义。
3如果s2
指向的数组是一个短于n
个字符的字符串,则空字符将附加到s1
指向的数组中的副本,直到{{1}所有人物都写过 4n
函数返回strncpy
的值。