gpt4 book ai didi

c - 在 c 中打印/存储 n 个字节的 u_char 指针?

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:09 25 4
gpt4 key购买 nike

我正在尝试创建一个函数来打印/存储 u_char 指针的前 n 个字节。这是我目前拥有的(只是试图打印第一个值),但它不起作用。

void print_first_value(const u_char * p) {
printf("%d", p[0]);
}

我也试过这个:

void print_first_value(const u_char * p) {
printf("%d", &p[0]);
}

我将如何进行这项工作?最后我想遍历*p中的各个值,但我只能通过这段代码在p指向的地址打印整个字符串。

void print_first_value(const u_char * p) {
printf("%s", p);
}

所以我打印的是数据包,抱歉我没有提到。最后一段代码以十六进制打印数据包,所以类似于 0050 5686 7654 0000... 我想打印/存储某些索引处的值。所以我想要前两个 block 00505686,然后是接下来的两个,依此类推。

最佳答案

首先,关于您的代码的几点注意事项:

  • u_char不是标准类型。 unsigned char是这种类型的标准拼写方式。虽然您可能正在使用 typedef在您的代码库中(例如 typedef unsigned char u_char; ),最好使用标准类型,尤其是在使用 typedef 发布代码时没有 typedef本身。
  • &p[0]p无论 p 的值如何,在 C 中表示完全相同的东西(假设它是一个指针)。同样的道理,p[0]*p也是同一个意思。我将使用 p*p仅在进一步的示例中,但请记住等价性。
  • unsigned char是一个整数类型。这意味着它的值是一个整数。这个值也可以解释为一个字符这一事实是偶然的。这很快就会非常重要。

现在,至于您的代码片段。让我们以相反的顺序进行。如您所知,最后一个只是打印字符串。

第二个是未定义的行为。 printf("%d", p) ( &p[0] = p ,还记得吗?)传递一个指针作为参数( p 的类型是 const unsigned char * ),但是 %d期望一个 int .参数必须与格式说明符指示的类型相匹配;否则就是错误的。它可能“工作”(例如,不是崩溃),但这是您绝对不应该做的事情。这不是有效的 C。

第一个是最有趣的。首先,printf("%d", *p)不是未定义的行为,不像第二个片段的情况。 *pconst unsigned char (指针已被取消引用),以及任何窄于 int 的类型晋升为 int在可变参数列表上( printf 被定义为 int printf(const char *, ...) ;末尾的 , ... 表示它接受任何数量的任何类型的参数,并且由于这个原因它通常被称为可变参数),所以这个有效。

事实上,它确实有效。让我们尝试使用它的完整程序:

#include <stdio.h>

void print_first_value (const unsigned char * p) {
printf("%d", *p);
}

int main (void) {
char str[] = "Hello world!";
print_first_value(str);
return 0;
}

假设您使用的不是特别奇怪的计算机或操作系统,您将得到 72以这种方式打印。这没有错! 72恰好是在 ASCII 中内部表示大写字母 H 的数字(称为 codepoint)。记住我是怎么说的 unsigned char是一个整体类型?这就是它的意思:它的值实际上是一个数字。您要求计算机打印该号码,它确实打印了。

如果你想打印这个数字代表的字符,你有两个选择:使用%c作为 printf 中的格式说明符(告诉它打印字符)或使用 putchar/putc函数(它接受一个数字并打印它们代表的字符)。让我们选择后者:

#include <stdio.h>

void print_first_character (const char * p) {
// it doesn't matter if it is unsigned or signed,
// because we're just printing the character
putchar(*p);
}

int main (void) {
char str[] = "Hello world!";
print_first_character(str);
return 0;
}

现在你会得到 H .到达某个地方!现在,要打印字符串中的所有字符,我们需要知道一个额外的细节:在字符串中所有有意义的字符之后,最后一个字符始终为零。如,数字零,而不是字符 '0' . (这通常写为 '\0' ,但这与零相同。)所以,我们开始吧:

#include <stdio.h>

void print_first_character (const char * p) {
putchar(*p);
}

int main (void) {
char message[] = "Hello world!";
const char * str = message; // initialize the pointer to the beginning of the string
while (*str) { // while *str isn't zero
print_first_character(str); // print the character...
str ++; // ...and advance to the next one
}
putchar('\n'); // let's print a newline too, so the output looks nicer
return 0;
}

我们开始吧! Hello world!将被打印。当然,puts("Hello world!");本来可以做同样的事情,但那不是那么有趣,是吗?

关于c - 在 c 中打印/存储 n 个字节的 u_char 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54965440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com