C Noob:在将char *的内容复制到其中时定义char数组的大小

问题描述

|| 我在C中有一个基本问题。 我需要打印一个char指针的内容内容是二进制的,因此我使用十六进制格式来查看内容。 检测null是否仍然有效?
unsigned char *input = \"������\";
printf(\"input =\");
int count = 0;
while(*input != \'\\0\'){
    printf(\"%02x\",*input);
            input++;
}
printf(\"\\n\");
现在,如果我必须将指针复制到char数组怎么办? 如何分配char数组的大小?我了解sizeof仅返回char指向的数据类型的大小。但是有什么办法吗?
unsigned char copyInput[size??];
strcpy(copyInput,input);
for (i=0,i <size?,i++)
{
printf(\"copyInput[%d]= %02x\",i,copyInput[i]);
}
提前致谢!     

解决方法

1)就C完全具有字符串的程度而言,它们被定义为“以零字节结尾的非零字节的任意连续序列”。因此,如果保证二进制数据绝不包含值为零的字节,则可以安全地将其视为C字符串(将其与
str*
函数一起使用,等等)。但是,如果您的二进制数据的中间位置可能有零字节,则需要分别跟踪长度,并使用
mem*
函数对其进行操作。 2)使用
strlen
查找字符串的长度(不包含终止的零字节)。但是,在标准C89中,您不能使用
strlen
的结果来设置
char[]
变量的大小,因为在编译时必须知道该大小。如果您使用的是C99或GNU扩展,则可以在运行时定义数组的大小:
size_t n = strlen(s1);
char s2[n+1];
memcpy(s2,s1,n);
ѭ8是必需的,否则您将没有空间来终止NUL。如果不能使用C99或GNU扩展,则唯一的选择是在堆上分配空间:
size_t n = strlen(s1);
char *s2 = malloc(n+1);
memcpy(s2,n);
或者,使用通用库扩展名,
char *s2 = strdup(s1);
无论哪种方式,别忘了以后再付11英镑。顺便说一句,在这种情况下,使用
strcpy
是安全的,因为您通过构造知道目标缓冲区足够大。我使用
memcpy
是因为它可能会稍微更有效,并且这意味着人类读者不会看到“ strcpy”并且开始担心。     ,如果它是一堆以0结尾的
char
,请使用
strlen()
,因为这是C \定义的字符串。没关系,某些(或大多数)字符是不可打印的,只要终止符为0。     ,如果任何输入字节为0,您将遇到问题。在这种情况下,循环将在该字符处停止。否则,您可以将其视为字符串。 将其视为字符串,可以使用ѭ15来获取输入的大小,然后为副本动态分配内存。可以像使用
strcpy
一样进行复印,但是使用
strncpy
更安全。
char *input = \"input binary array\";
int count = strlen(input)+1; // plus \'\\0\'
char *copy = (char *) malloc(count*sizeof(char));
strncpy(copy,input,count+1);