C从字符指针初始化字符数组

时间:2014-08-04 00:22:25

标签: c arrays pointers char initialization

我的问题应该很简单。

我需要给一个函数一个预定义长度的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....."

在我的记忆中?

抱歉,如果这太愚蠢了,但我现在似乎无法找到解决方案。

4 个答案:

答案 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}所有人物都写过   4 n函数返回strncpy的值。