글쎄, 이것은 스스로 가르치는 연습이기 때문에, 아래 첨자와 포인터 산술 사이의 동등성에 대한 KTC의 좋은 설명과 비교/대비 될 수있는 대안을 살펴보십시오.
표준 라이브러리 기능이나 하위 스크립트를 사용하지 않고 strdup()
함수를 구현하는 것 같습니다.
malloc()
에 대해 예외를 만들겠습니다. 위의 방법을 사용하지 않고 위의 작업을 수행 할 수있는 합리적인 방법이 없으므로 사용하는 것이 무엇을 가르치는 것에 해가되지 않습니다.
첫째, 우리는 라이브러리에서 사용할 수있는 것과 비슷 함수 호출의이 strdup()
의 기본 구현을하자 :
size_t myStrlen(char* s)
{
size_t len = 0;
while (*s != '\0') { /* when s points to a '\0' character, we're at the end of the string */
len += 1;
s += 1; /* move the pointer to the next character */
}
return len;
}
void myStrcpy(char* dst, char* src)
{
while (*src != '\0') { /* when src points to a '\0' character, we're at the end of the string */
*dst = *src;
++dst; /* move both pointers to next character location */
++src;
}
*dst = '\0'; /* make sure the destination string is properly terminated */
}
을 : 첨자없이
size_t myStrlen(char* s);
void myStrcpy(char* dst, char* src);
char* strdup(char* p)
{
size_t len = myStrlen(p);
char* dup = (char*) malloc(len + 1); /* include space for the termination character */
if (dup) {
myStrcpy(dup, p);
}
return dup;
}
지금 작업자의 기능을 구현할 수 있습니다을
그리고 거기 있습니다. 이것은 할당의 조건을 만족시키고 첨자를 사용하는 대신 데이터 항목 배열을 통해 포인터를 조작 할 수있는 방법을 보여줍니다. 물론 myStrlen()
과 myStrcpy()
루틴에 대한 논리는 원하는 경우 인라인으로 이동할 수 있으며 데이터를 복사하는 표현식에서 포인터 증가가 발생할 수있는 관용적 인 표현이 더 많이 사용될 수 있습니다 (하지만 초보자에게는 혼란 스럽습니다).
왜 라이브러리 함수 또는 하위 스크립트를 사용하지 않습니까? 사용할 라이브러리 함수 (strlen(), strcpy() 및/또는 memcpy())는 모두 매우 간단하게 구현할 수 있습니다. 확실히 당신이 그들을 사용하도록 허락받지 못한다면 (숙제?) 그것은 당신 자신의 임프레션을 해결하는 것이 매우 쉽습니다. –
나는 스스로 가르치는 책에서 운동을한다. – trikker
나는 스스로 학습하는 책이다. subscripting을 처리하기 위해 포인터 산술 연산을하고 있습니다. – trikker