2014-03-19 2 views
0

함수는 s가 가리키는 문자열에서 ch의 마지막 항목을 찾습니다. 문자에 대한 포인터를 반환하거나 문자열에 ch가 없으면 널 포인터를 반환합니다. 문자열 라이브러리 함수를 사용하지 않고 함수를 작성하려고합니다.포인터를 사용하여 문자열에서 char의 마지막 항목 찾기 (C 언어)

이것은 내가 지금까지 가지고있는 것인데, 나에게 맞는 것처럼 보이지만 결과 문자열을 얻을 수없는 것 같습니다.

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

char *strrchr2(char *s, char ch); 

int main() 
{ 
    char str1[100]; 
    char char1; 
    char result_str[100]; 

    printf("\nEnter a string: "); 
    gets(str1); 
    fflush(stdin); 
    printf("Enter the target char in the string: "); 
    scanf("%c", &char1); 
    char * result_str = strrchr2(str1, char1); 
    printf("Resultant string = %s", result_str); 

char * strrchr2(char *s, char ch) 
{ 
    int count = 0, offset = 0; 
    while (*(s + count) != '\0') 
    { 
     if (*(s + count) == ch) 
      offset = count; 
     count++; 
    } 
    return *(s + offset); 
} 

예상 출력 :

Enter a string: abcdefdfdfghh 
Enter the target char in the string: f 
Resultant string: fghh 
+3

'result_str'을 두 번 선언하고 있습니다 !! –

+2

컴파일러는'return * (s + offset);'라인에서 에러를 출력해야합니다. 'char'를 'char *'로 변환 할 수 없습니다. ' –

+1

'fflush (stdin)'은 정의되지 않은 동작입니다. –

답변

3
return *(s + offset); 

당신은 s[offset]에서 여기 문자를 반환한다. 문자열을 스캔 : 당신은 (s + offset)

return (s + offset); 
+0

... 일단 고정되면, 문자열에 문자가 존재하지 않으면 NULL 포인터를 반환하지 못합니다. – mfro

+0

@mfro NULL 포인터를 반환하는 방법을 모르겠습니다. * s = '\ 0 '을 반환하고 else 부분에 s를 반환합니까? – unintendedjoy

+0

@unintendedjoy 당신은 잘못된 방향으로 가고 있습니다. – zoska

2
const char* strchr_last (const char* s, char ch) 
{ 
    const char* found_at = NULL; 

    while(*s != '\0') 
    { 
    if(*s == ch) 
    { 
     found_at = s; 
    } 
    s++; 
    } 

    return found_at; 
} 
1

당신은 약간의 변화, 문자열에서 문자의 첫 번째 항목을 찾아 내기로 동일한 기능을 수행 할 수있다이 위치에 포인터을 반환해야 끝에서 시작까지.

char* strrchr2(char *s, char ch) 
{ 
    char* p = s; 
    int found_ch = 0; 
    //finding the length of the string 
    while (*p != '\0') 
    { 
     p++; 
    } 
    //p now points to the last cell in the string 
    //finding the first occurrence of ch in s from the end: 
    while (p >= s && !found_ch) 
    { 
     if (*p == ch) 
     { 
      found_ch = 1; 
     } 
     else 
     { 
      p--; 
     } 
    } 
    if (!found_ch) 
    { 
     p = 0; 
    } 
    return p; 
} 
+1

아마도 내 대답처럼 문자열을 한 번 반복하는 것이 좋습니다. 검색된 문자가 문자열의 맨 앞에 만 앉는 최악의 경우 시나리오에서 코드는 전체 문자열을 두 번 반복해야합니다. 첫 번째 전달 및 뒤로. 이 알고리즘이 더 잘 수행되는 유일한 경우는 검색된 기호가 항상 문자열의 끝에있을 것으로 예상되는 경우입니다. – Lundin