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

时间:2011-04-13 14:51:05

标签: c

我在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]);
}

提前致谢!

3 个答案:

答案 0 :(得分:1)

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);

n+1是必要的,否则您将无法获得终止NUL的空间。如果你不能使用C99或GNU扩展,你唯一的选择是在堆上分配空间:

size_t n = strlen(s1);
char *s2 = malloc(n+1);
memcpy(s2, s1, n);

或者,使用公共库扩展,只需

char *s2 = strdup(s1);

无论哪种方式,都不要忘记free(s2)。顺便说一句,这是一个使用strcpy安全的情况,因为你知道目标缓冲区足够大。我使用了memcpy因为它可能稍微有点效率,这意味着人类读者不会看到“strcpy”并开始担心。

答案 1 :(得分:0)

如果是一堆char以0结尾,只需使用strlen(),因为这是C对字符串的定义。只要0是终结符,一些(或大多数)字符可能是不可打印的并不重要。

答案 2 :(得分:0)

如果任何输入字节为0,则会出现问题。在这种情况下,循环将停止在该字符处。否则,您可以将其视为字符串。

将其作为字符串处理,您可以使用strlen()获取输入的大小,然后为您的副本动态分配内存。可以使用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);