2017-09-26 24 views
0

我试图完成下列工作: 给出的函数: int f(void *p) 取p的第一个字节,并提取其作为一个字符。然后根据该字符决定将哪些附加字节提取为短整数。例如,如果我有一个特定的字符c,然后提取字节4和7作为短整数并将它们存储在单独的变量中;如果我有一个不同的字符d提取字节3,4,5,并将它们存储为单独的变量。用这些信息执行一些其他不相关的代码。我一直在挣扎几个小时。提取从同一空指针的字符和各种短整型用C

我尝试以下:

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

过了一会我意识到我试图去引用一个不起作用的void指针。所以我尝试铸造:

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

这给了我一个seg故障。

我尝试了类似的东西与短诠释铸造无济于事。如果这是一个有点不好的问题,我很抱歉。我是C新手,指针和引用的全部概念对我来说都是新手。我的第一语言是Java,它更宽容。

+2

你无法对'void'指针进行算术运算。 – jxh

+0

为什么'f'只需要一个'char *'参数,因为这就是你传递给它的东西? – aschepler

+0

形式上,你不能对'void *'进行算术运算。令人遗憾的是,GCC并没有强制执行该操作,并且在指针运算时将'void *'视为大致等价于'char *', –

回答

1
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指针。字符串的元素是char s,而不是short s。即使他们是数字,他们仍然是char s。

将它们保留为char s,切换到%c来打印它们,并确保在您执行操作时取消引用指针。

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

我为printf(“%s%s%s,%s”,第一,第三,第五,第七)提出了一个小而重大的错误;成为printf(“%s%i%i,%i”,第一,第三,第五,第七);抱歉。 –

3

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

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'偏移计算顺序值。

+0

我的意思是printf(“%s%s%s,%s”,第一,第三,第五,第七)。成为printf(“%s%i%i,%i”,第一,第三,第五,第七); –

+0

@ SamK9:'printf'的'%i'和'%d'是相同的。但是,您的输入不包含整数。您的输入是一个字符串,您的预期输出对应于字符串中的字符。 – jxh

+0

是的,但我需要将它们转换为短整数,所以我可以与它们进行数学运算 –