2017-09-26 10 views
0

에서 같은 무효 포인터에서 문자 및 다양한 짧은 int 치의 압축을 풉니 다. 그런 다음 그 문자가 짧은 바이트로 추출 할 추가 바이트를 결정하는 것에 기초합니다. 예를 들어, 특정 문자가있는 경우, 4 바이트와 7 바이트를 짧은 정수로 추출하여 별도의 변수에 저장합니다. 내가 다른 어떤 문자를 가지고 있다면, 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); 

} 

내 결과 :

나는 다음과 같은 시도 , -1295010920 -1295010922 ▒▒ς을 -1295010918

예상 : * 4 1 3

후 나는 깨달았다 잠시 작동하지 않는 void 포인터를 역 참조하려고했습니다. 그래서 나는 주조를 시도했다 :

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

이것은 나에게 seg 결함을 줬다.

짧은 int 캐스팅으로 비슷한 것을 시도했지만 아무 소용이 없습니다. 이것이 다소 불쾌한 질문 인 경우 사과드립니다. 나는 C에 익숙하지 않으며 포인터와 참조의 전체 개념은 새로운 것이다. 제 첫 번째 언어는 자바 였고 훨씬 더 관대합니다.

+2

'void'포인터에 대해 산술 연산을 수행 할 수 없습니다. – jxh

+0

'f'는'char *'매개 변수를 가져 오지 않는 것이 어떻습니까? – aschepler

+0

공식적으로, 여러분은'void * '에 산술 연산을 할 수 없습니다. 안타깝게도 GCC는이를 강제하지 않으며'void *'를 포인터 연산에 관해서'char *'와 거의 동일하게 취급합니다. –

답변

1
char *first = &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입니다. short이 아닙니다. 숫자 일 때도 여전히 char입니다.

char으로 두십시오. 인쇄하려면 %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 :'% i'과'% d'은'printf'와 동일합니다. 그러나 입력 내용은 정수로 구성되지 않습니다. 당신의 입력은 문자열이고 예상되는 출력은 문자열 내의 문자에 해당합니다. – jxh

+0

네,하지만 짧은 정수로 변환해야합니다. 그래서 그들과 수학 연산을 할 수 있습니다. –