2017-09-26 70 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

是的,但我需要將它們轉換爲短整數,所以我可以與它們進行數學運算 –