2014-01-22 2 views
0

시험에 대한 perparation에서 c/C++에 대한 몇 가지 일반적인 질문을하겠습니다. 이 질문 중 하나는 leer (char * a) 함수가 반환하는 값을 설명하는 것입니다. 함수가 C 문자열의 공백 수를 반환 할 것으로 기대했지만, 테스트 결과 leer가 실제로 첫 번째 char을 확인하므로 첫 번째 요소가 공백이면 0을, 그렇지 않으면 0을 반환합니다. 문자열을 반복하지만 첫 번째 문자를 확인한 후에 반환하지만 주 함수 내부의 동일한 루프는 처음에 생각한 것처럼 모든 공백을 계산합니다. leer에 대한 인수가 내 주요 함수 내부의 for 루프에서 사용하는 것과 같기 때문에 왜 다르게 동작하는지 이해하지 못합니다. 여기서 포인터 지식이 부족하다고 생각하지만 처음 생각이 잘못된 이유를 파악할 수 없습니다.함수 인수로 char *를 전달하면 예기치 않은 동작이 발생합니다.

#include <iostream> 

int leer(char *a) 
{ 
    for(int b=0;*a!='\0';a++) 
    { 
     if(*a==' ') b++; 
     return b; 
    } 
} 

int main() 
{ 

char *a = "Dies ist ein Test"; 
std::cout << leer(a) << std::endl; //Prints 0 
int b; 
for(b=0;*a!='\0';a++) 
    { 
     if(*a==' ') b++; 
    } 


std::cout << b << std::endl; //Prints 3 

} 
+0

포인터와 아무 관련이 없습니다. return 문을보십시오. – Borgleader

+0

그래, 그거 당황 스럽네 : D 나는 포인터에 너무 집중하여 눈치조차 못했다. 지적 해 주셔서 감사합니다. 몇 시간 동안 검색했을 것입니다. – user3225499

답변

1

두 개의 루프가 완전히 동일하지 않습니다. leer에서 return 문은 루프 안에 있습니다. 즉, 첫 번째 반복에서 반환되고 실제로 문자열을 통해 계속할 수있는 기회는 없습니다.

그러나 루프는 main에 있지만 문자열을 통해 계속되는 것을 막는 요소는 없습니다. b의 값이 증가되고 루프 이후에 출력됩니다.

귀하의 leer 함수는 동일한 방법으로 작성해야하며, 루프 이후에 b 값이 반환됩니다.

+0

명백한 종류이지만 포인터에 너무 집중했습니다. D. 어쨌든 대답을 주셔서 감사합니다. – user3225499

2

문제는 첫 번째 반복 이후에 반환한다는 것입니다. 당신은 루프 후 return 문을 배치 할 필요가 의도 한대로 작동 나던 이유

for(int b=0;*a!='\0';a++) 
{ 
    if(*a==' ') b++; 
} 
return b; 
+0

답변을 주셔서 감사합니다. 포인터에 너무 집중했습니다. 전혀 눈치 채지 못했습니다. – user3225499

0

이유는 return 문 return b;입니다. 이론적으로 모든 반복에서 실행되지만 사실상 첫 번째 단계에서만 실행됩니다. 왜냐하면 우리가 실행 한 후에 더 이상 for-loop에 있지 않기 때문입니다. 때문에에

+0

답변을 주셔서 감사합니다. 몇 시간 동안 검색했을 것입니다. D. Totaly는 그것을 얻지 않았다. – user3225499

0

주()는이 첫 번째 반복 한 후 루프를 종료합니다

return b; 

에서처럼 ... 반환이 없습니다.

쉽게 읽을 수 있도록 코드의 서식을 지정하는 것이 좋습니다.

+0

예, 누군가가 올바른 경로로 다시 안내하면 분명합니다. 작업의 원래 형식은 이것이다, 더 악화입니다 : \t 'INT의 곁눈질 (문자 * A) (INT B = 0; * A = '\ 0'; ++!)에 대한 { \t \t 경우 (* a == ') b ++; \t return b; }' 방금 ​​컴파일러에서 어떤 이유로 든 변경했습니다. 그래서 질문에 대한 정답은 공백의 양도 아니며 첫 번째 문자가 공백이 아닐 수도 있습니다.b는 for 루프의 범위에 정의되어 있으므로 반환 할 때는 표시되지 않으며 반환되는 유일한 것은 구문 오류입니다. 맞습니까? – user3225499

관련 문제