2009-10-07 5 views
1

반환하는 경우 우리는 문자로 구성되어 가장 긴 문자열을 반환하는 함수 을 보유하고 있습니다. 예 :C는 -/그렇지 및 포인터가 잘못된 문자열

longest("112****hel 5454lllllo454") 

가 반환 : 나는이 프로그램을 실행하면

lllllo는 그러나 lllllo454를 반환하는 것 같다.

내가 여기 보이지 않아요 뭔가가있다
char *longest(char *s){ 
    char *pMax = NULL; 
    int nMax = 0; 
    char *p = NULL; 
    int n = 0; 
    int inside = 0; //flag 
    while(*s!='\0'){ 
     char c = *s; 
     if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){ 
      if(inside == 0){ 
       n = 1; 
       p = s; 
       inside = 1; 
      } 
      else 
       n++; 
      if(inside == 1){ 
       if(n > nMax){ 
        nMax = n; 
        pMax = p; 
        inside = 0; 
       } 
      } 
     }//end isLetter if 
     s++; 
    } 
    return pMax; 
} 

... 너희들은 어떻게 생각하십니까 : 여기에 기능은 무엇입니까?

답변

6

당신은 가장 긴 문자열의 첫 번째 문자에 대한 포인터를 반환한다. 부분 문자열이 끝난 후에 실제로 문자열 종료자를 추가하지 않으므로 원래 문자열의 끝까지 계속됩니다. 아마도 하위 문자열 (시퀀스의 문자 만)을 새 문자열에 복사하고 포인터를 반환해야합니다.

char* newStr = malloc(nMax+1); 
strncpy(newStr, pMax, nMax); 
*(newStr+nMax) = '\0'; 
return newStr; 
+1

그렇지 않으면 "int * nMax"가 출력 매개 변수로 사용됩니다. 그렇다면 * nMax에 할당하기 전에 null 검사를하는 것이 가장 좋습니다. 일반적으로 "필요하지 않습니다"라는 규칙이 있습니다. – Steve314

3

당신은 nMax을 계산하지만, 해당 정보로 아무것도하지 않습니다. C에서 char*은 NUL 문자로 끝나는 문자 스트링의 시작을 가리 킵니다. 함수에 전달 된 버퍼를 수정하지 않으므로 반환 된 포인터는 첫 번째 'l'을 가리키고 원래 문자열의 끝까지 계속됩니다.

0
당신은 가장 긴 문자열의 첫 번째 문자에 대한 포인터를 반환하는

; 당신은 그것에서 새로운 끈을 만들고 있지 않습니다. 따라서 여러분이 그것을 출력 할 때, NULL 종결 자까지 부분 문자열을 출력합니다. http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

0

이 문자열로 시작하는 가장 큰 문자열 를 반환

은 strncpy에서 기능을 참조하십시오. 다음, inside 설정 기능의 일부 : c 편지이면

if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

만 실행된다. 당신이 편지를 포함하는 가장 큰 문자열을 원하기 때문에, 당신이 할 필요가 :

if(c != ' '){

그런 다음, 그 루프 내부에 또 다른 변수가, containsLetter 말, 당신이 편지가 발생하면 그는 사실이다 다른 공간 앞에.