2017-04-24 1 views
0

일부 C++에서 쓸어 버렸으므로 해결하려고하는 문제 중 하나는 문자 포인터의 문자 수를 계산하여 예상 한 것과 비교하여 확인하는 것입니다. 그러나 내 솔루션에서, 나는 특별한 결과를 발견했다. 내 함수에 char에 대한 참조를 건네 주었고 3을 반환했습니다. 참조 테스트가 문자 참조에 대해 3을 반환하는 이유는 무엇입니까?문자 포인터의 문자 계산

문자에 널 종결자가 없으므로 코드가 계속 계산되지만 결국 결과를 반환하므로 솔루션이 부족하다는 것을 의미합니다. 보다 견고한 아이디어가 있습니까? 여기 내 해결책과 결과가있다.

CountCharacters.cpp

#include <cstdio> 
#include <iostream> 

#define ASSERT_EQUALS(paramx1, paramx2) \ 
{\ 
     int param1 = paramx1;\ 
     int param2 = paramx2;\ 
     if (param1==param2)\ 
       std::cout << "PASS! param1=" << param1 << " param2=" << param2 << std::endl;\ 
     else\ 
       std::cout << "FAIL! param1=" << param1 << " param2=" << param2 << std::endl;\ 
} 

int countCharacters(const char * characters); 


int main() 
{ 
     char character = '1'; 
     ASSERT_EQUALS(countCharacters("string8\0"), 7); 
     ASSERT_EQUALS(countCharacters("\0"), 0); 
     ASSERT_EQUALS(countCharacters(""), 0); 
     ASSERT_EQUALS(countCharacters(NULL), 0); 
     ASSERT_EQUALS(countCharacters(&character), 1); 
     ASSERT_EQUALS(countCharacters('\0'), 0); 
     return 0; 
} 


int countCharacters(const char * characters) 
{ 
     if (!characters) return 0; 
     int count = 0; 
     const char * mySpot = characters; 
     while (*(mySpot) != '\0') 
     { 
       std::cout << "Count=" << count << " mySpot=" << *(mySpot) << std::endl; 
       count++; 
       mySpot++; 

     } 
     return count; 
} 

결과 :

PASS! param1=7 param2=7 
PASS! param1=0 param2=0 
PASS! param1=0 param2=0 
PASS! param1=0 param2=0 
FAIL! param1=2 param2=1 
PASS! param1=0 param2=0 
+0

몇 개의 바퀴를 재발 명하고 싶습니까? codereview 사이트가 있습니다. –

+1

[단일 문자에 대한 Strlen 함수 동작]의 가능한 복제본 (http://stackoverflow.com/questions/35477662/strlen-function-behavior-on-single-character) –

+0

countCharacters를 적용 할 수 없습니다 기능을이 시나리오에 적용합니다. null로 끝나는 문자열이나 단일 문자가 주어 졌는지 알 수있는 방법이 없습니다. 이 일을 할 때 가장 좋은 방법은 char * 함수를 오버로드하여 1을 반환하는 것입니다. – Squidy

답변

1

당신은 문자에 대한 참조를 전달 아닙니다. 포인터를 전달 중입니다. 특히,이 포인터는 C를 배울 때

&character 

& 및 * 기호는 조금 혼란 ++.

char character = '1';    // <- char variable 
char* characterPtr = &character; // <- pointer to the char variable 
char& characterRef = *characterPtr; // <- reference to the char variable 

그래서, 당신은 문자에 대한 포인터를 전달하는 당신의 함수는 문자열의 머리처럼 치료하고 그 때까지 문자를 계산 : 자신의 위치 위치에 따라, 그들은 포인터 나 참조를 할 수 있습니다 nullptr를 친다. 방금 몇 문자가 떨어져서 왜 값이 2가되는지 알 수 있습니다.

EDIT : C/C++에는 문자 유형이없는 기본 문자열 유형이 없습니다. 따라서 문자열의 머리와 같은 문자를 다루는 것을 포함하는 라이브러리가 필요합니다. 규약은 nullptr이 문자열을 종료한다는 것입니다. 그래서, 당신은 그 대회를 멋지게 연습하고 있지만, 캐릭터의 포인터와 캐릭터의 머리 부분의 포인터 사이에는 아무런 차이가 없다는 것을 보여주기 때문에, 실수로 포인터를 캐릭터에 전달하는 것이 쉽습니다. 문자열을 기대하는 함수. 함수가 여러분이 메모리를 할당했다고 가정하기 때문에 함수가 '문자열'로 문자를 복사하기 시작하면 정말 흥미로워진다. 그러나 다른 데이터가 부숴 질 수있다.

위험 할뿐만 아니라 문자열을 사용하는 또 다른 주요 단점은 고유 기능이 없으므로 조작하기가 지루하다는 점입니다. 그래서 STL과 같은 멋진 라이브러리가 이러한 문제를 해결하기 위해 작성되었습니다. 그들은 포인터를 필요로하지 않으므로 사용하는 것이 훨씬 안전합니다 (대신 참조를 사용하고 범위 검사를 할 수 있음). 메소드에 많은 빌드가 있으므로 필요한 코딩 양을 줄일 수 있습니다.

+0

아 ... 알았어. - 그래서 나는 정의되지 않은 행동을 때리고있다. 나는 그걸 어떻게 스스로 지켜 줄까요? – nndhawan

+0

이것은 nit이지만이 정의되지 않은 동작이라고하지는 않습니다. 문제는 C/C++에 네이티브 문자열 유형이 없다는 것입니다. 오히려 일련의 문자에 대한 포인터를 사용합니다. 포인터는 굉장하고 위험하기 때문에 절대로 사용하지 않아야합니다. 귀하의 질문에 대한 간단한 대답 : std :: string을 사용하십시오. – buttonsrtoys

+0

확인 @button. 그래서 면접에서이 해결책을 주면이 대답은 충분할 것이고 함수 서명이 주어지면 5 번째 사례를 해결할 수 없다고 무시할 수 있습니다. – nndhawan