2012-11-01 2 views
0

문자열에서 문자의 첫 번째 항목 색인을 int로 가져오고 해당 위치를 가리키는 포인터를 가져 오지 못하게하려면 어떻게합니까? 당신이 C에서 배열이 포인터가있는 경우strchr에서 포인터 대신 int 가져 오기

답변

5

, 당신은 간단하게 수행 할 수 있습니다 base_address 배열 자체

index = later_pointer - base_address; 

.

#include <stdio.h> 
int main (void) { 
    int xyzzy[] = {3,1,4,1,5,9};  // Dummy array for testing. 

    int *addrOf4 = &(xyzzy[2]);  // Emulate strchr-type operation. 

    int index = addrOf4 - xyzzy;  // Figure out and print index. 
    printf ("Index is %d\n", index); // Or use ptrdiff_t (see footnote a). 

    return 0; 
} 

출력 : 예를 들어

Index is 2 

당신이 볼 수 있듯이, 그것은이 char하지만 대한 중요하지 않는 것이 기본 유형 (관계없이 당신에게 인덱스를주고 제대로 확장 일반적인 경우에 알면 유용합니다.) 당신의 문자열이 mystring하고있는 경우

그래서, 특정 경우에, strchr의 반환 값은 단지 인덱스 얻을 chpos - mystring를 사용 chpos입니다 ( 물론 문자 발견을 가정을, 즉, chpos != NULL).


는 (a) 같이 바르게 댓글에서 지적 포인터 공제의 종류 int에 다른 범위를 가질 수 ptrdiff_t이다. 당신의 배열의 차이가 int에 맞지 않을 정도로 큰있을 경우에만 문제가 될 것

ptrdiff_t index = addrOf4 - xyzzy;  // Figure out and print index. 
    printf ("Index is %td\n", index); 

참고 : 완벽하게 정확하려면 인덱스의 계산 및 인쇄가 더 잘 할 수있다. 두 가지 유형의 범위가 직접 관련이 없으므로 가능합니다. 휴대형 코드를 중요하게 생각한다면 ptrdiff_t 변형을 사용해야합니다.

+0

find_first_of : 문자열을 :: 표준을 사용할 수 있습니다 아마도 1 바이트보다 큰 유형의 배열에 대해 sizeof (type)로 나누는 것에 대해 언급해야할까요? –

+0

@Mike, C가 자동적으로 포인터 산술을 스케일링하기 때문에 실제로 같은 타입이 필요한 것은 아닙니다. 나는 그 대답에 덧붙였다. – paxdiablo

+0

감사합니다. – hesson

3

를 사용하여 포인터 연산 :

char * pos = strchr(str, c); 
int npos = (pos == NULL) ? -1 : (pos - str); 
관련 문제