问题描述
||
我在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);