【问题标题】:extract a character and various short ints from the same void pointer in C从C中的同一个void指针中提取一个字符和各种短整数
【发布时间】:2017-09-26 00:17:31
【问题描述】:

我正在尝试完成以下任务: 给定功能: int f(void *p) 取 p 的第一个字节并将其提取为字符。然后根据该字符的内容确定要提取哪些附加字节作为短整数。例如,如果我有某个字符 c 则将字节 4 和 7 提取为短整数并将它们存储在单独的变量中;如果我有某个不同的字符 d 提取字节 3、4、5 并将它们存储为单独的变量。使用此信息执行一些其他不相关的代码。我已经为此苦苦挣扎了好几个小时。

我尝试了以下方法:

int f(void *p) {
    char *first = &p;
    short int *third =  p + 2;
    short int *fifth =  p + 4;
    short int *seventh =  p + 6;
    printf("%s %s %s, %s", first, third, fifth , seventh);

}

int main(int argc, char const *argv[]) {
    char test[] = "*5431234567";
    f(test);

}

我的结果: ▒▒ϲ -1295010922 -1295010920, -1295010918

预期: * 4 1 3

过了一会儿,我意识到我试图取消引用无效的指针。所以我尝试了铸造:

char* c = (char*) p;
char first = (char) (*c)
printf("%s", first);

这给了我一个段错误。

我尝试了类似的短整数转换无济于事。如果这是一个有点无聊的问题,我很抱歉。我是 C 的新手,指针和引用的整个概念对我来说是新的。我的第一语言是 Java,它更宽容。

【问题讨论】:

  • 你不能在 void 指针上进行算术运算。
  • 为什么不让f 只带一个char* 参数,因为这就是你要传递给它的参数?
  • 形式上,您不能对void * 进行算术运算。遗憾的是,GCC 并没有强制执行这一点,并且在指针算术方面将 void * 视为大致相当于 char *
  • @aschepler 因为这是一项任务,我必须使用该函数签名。
  • fix like this 另外如果函数f需要是int f(void *p)的签名,你需要返回一个(int)值。

标签: c pointers void-pointers


【解决方案1】:

您的输入是一个字符串,而您的预期输出是字符串中的单个字符。没有什么short int-like 这个问题。

char *s = p;
printf("%c %c %c, %c", s[0], s[2], s[4] , s[6]);

如果您需要将这些值存储到short int 变量中,则不需要指针。

short int x = s[2] - '0';
short int y = s[4] - '0';
short int z = s[6] - '0';

printf("%c %hd %hd %hd\n", s[0], x, y, z);

保证表示十进制数字的字符是连续的,因此您可以通过计算与'0' 的偏移量来计算序数值。

【讨论】:

  • 哎呀我的意思是 printf("%s %s %s, %s", first, third, Fifth , Seventh);成为 printf("%s %i %i, %i", first, third, Fifth , Seventh);
  • @SamK9: %i%dprintf 相同。但是,您的输入不包含整数。您的输入是一个字符串,您的预期输出对应于字符串中的字符。
  • 是的,但我需要将它们转换为短整数,以便我可以对它们进行数学运算
  • 您正在更改您的要求。如果您确实有与本问题中提出的问题不同的问题,请提出一个新问题。
  • 您没有提取short ints。您正在从代表十进制数字的字符串中提取单个char,并且您希望将数字的值存储在short int 中。提取short int 意味着您有一个short int 变量,然后以某种方式将其值编码到字符串中。但。这不是你要介绍的。您的输入只是一个常规字符串。
【解决方案2】:
char *first = &p;

摆脱&。您不想要p 变量的地址,您希望将地址存储在中,即p

char *first = p;

short int *third =  p + 2;
short int *fifth =  p + 4;
short int *seventh =  p + 6;
printf("%s %s %s, %s", first, third, fifth, seventh);

没有理由使用short 指针。字符串的元素是chars,而不是shorts。即使它们是数字,它们仍然是chars。

将它们保留为chars,切换到%c 以打印它们,并确保在执行时取消引用指针。

char *third =  p + 2;
char *fifth =  p + 4;
char *seventh =  p + 6;
printf("%c %c %c %c\n", *first, *third, *fifth, *seventh);

【讨论】:

  • 我犯了一个小而重大的错误,我的意思是 printf("%s %s %s, %s", first, third, Fifth , Seventh);为 printf("%s %i %i, %i", 第一, 第三, 第五, 第七);对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多