문자열에있는 모든 단어의 첫 글자를 재귀 적으로 대문자로 만들려면 어떻게해야합니까?

user12535058

나는 이것을 어떻게 만들 수 있는지 궁금합니다. 반복이나 isalpha () 및 toupper () 함수를 원하지 않습니다. 우리는 우리 자신의 코드를 사용하여 입력을 읽고 싶습니다. 사용자가 모든 문자를 소문자로 입력한다고 가정합니다. 이것은 내가 지금까지 시도한 것입니다.

define MAX_LENGTH 100

int read_line(char str[],int);
void capitalize(char[]);

int main (void){
    char A[MAX_LENGTH];
printf("Enter a text \n");
read_line(A, MAX_LENGTH);

capitalize(A);
puts(A);


}

int read_line(char str[],int n){
    int ch,i=0;

    while ((ch = getchar()) != '\n'){
        if(i<MAX_LENGTH)
            str[i++] = ch;
    }
    str[i] = '\0';
    return i;
}

void capitalize(char str[]){
 int x = strlen(str);
 static int i = 0;
    if(str[i]=='\0')
    return;
    if(str[i-1]==' '|| i == 0)
      str[i] -= 32;
      i++;
      return capitalize(&str[i]);
 }

출력은 다음과 같습니다.

텍스트 입력 :

asdf sdf df

Asdf sdf df

내 코드에 어떤 문제가 있습니까?

Vlad / 모스크바

코드가 잘못되었습니다. 예를 들어 read_line 함수도

int read_line(char str[],int n){
    int ch,i=0;

    while ((ch = getchar()) != '\n'){
        if(i<MAX_LENGTH)
            str[i++] = ch;
    }
    str[i] = '\0';
    return i;
}

올바르지 않은 경우 적어도 때문에 i동일하다 MAX_LENGTH -1문자 배열 넘어 액세스 메모리가

str[i] = '\0';

그것은 루프의 조건이 처음에 잘못 쓰여진 것입니다.

재귀 함수의 경우 예를 들어 다음과 같은 방식으로 볼 수 있습니다.

#include <stdio.h>

int is_blank( char c )
{
    return c == ' ' || c == '\t';
}

char * capitalize( char *s )
{
    if ( *s )
    {
        int blank = is_blank( *s );

        if ( !blank )
        {
            *s &= ~' ';
        }

        capitalize( s + 1 );

        if ( !blank && !is_blank( *( s + 1 ) ) && *( s + 1 ) )
        {
            *( s + 1 ) |= ' ';
        }
    }

    return s;
}

int main(void) 
{
    char s[] = "hello everybody. how do you do?";

    puts( s );
    puts( capitalize( s ) );

    return 0;
}

프로그램 출력은 다음과 같습니다.

hello everybody. how do you do?
Hello Everybody. How Do You Do?

다음은 유사한 시연 프로그램이지만 고정 기능이 read_line있습니다.

#include <stdio.h>

#define MAX_LENGTH  100

int is_blank( char c )
{
    return c == ' ' || c == '\t';
}

char * capitalize( char *s )
{
    if ( *s )
    {
        int blank = is_blank( *s );

        if ( !blank )
        {
            *s &= ~' ';
        }

        capitalize( s + 1 );

        if ( !blank && !is_blank( *( s + 1 ) ) && *( s + 1 ) )
        {
            *( s + 1 ) |= ' ';
        }
    }

    return s;
}

size_t read_line( char *s, size_t n )
{
    int ch;
    size_t i = 0;

    while ( i + 1 < n && ( ch = getchar() ) != EOF && ch != '\n' )
    {
        s[i++] = ch;
    }

    s[i] = '\0';

    return i;
}

int main(void) 
{
    char s[MAX_LENGTH];

    read_line( s, MAX_LENGTH );

    puts( s );

    puts( capitalize( s ) );

    return 0;
}

문자열을 입력하려면

hello everybody. how do you do?

그러면 프로그램 출력은 위에 표시된 것과 동일합니다.

hello everybody. how do you do?
Hello Everybody. How Do You Do?

비트 연산이 명확하지 않은 경우 다음 문으로 대체 할 수 있습니다.

이 진술을 위해

*s &= ~' ';

이 진술을 위해

*s -= 'a' - 'A';

그리고이 진술

*( s + 1 ) |= ' ';

이 진술을 위해

*( s + 1 ) += 'a' - 'A';

정적 변수를 사용하여 재귀 함수를 구현하는 방법을 사용하는 경우 함수가 작동하지 않는 이유가 흥미로울 것입니다.

strlen의 호출로 첫 번째 진술을 무시하는 것을 고려해 봅시다.

void capitalize(char str[]){
 int x = strlen(str);
 static int i = 0;
    if(str[i]=='\0')
    return;
    if(str[i-1]==' '|| i == 0)
      str[i] -= 32;
      i++;
      return capitalize(&str[i]);
 }

우선 한 문자열에 대해 함수를 처음 호출 한 후 정적 변수 i가 이미 0과 같지 않기 때문에 다른 문자열에 대해 두 번째로 호출 할 수 없습니다 .

if 문의 조건은 최소한 다음과 같이 작성해야합니다.

    if ( i == 0 || str[i-1]==' ' )

즉, 하위 표현의 순서가 변경됩니다.

return 문은 표현식을 포함하지 않아야합니다.

      return capitalize(&str[i]);

당신은 그냥 쓸 수 있습니다

      capitalize(&str[i]);

그럼에도 불구하고 포인터의 초기 값 str이 변경되었습니다. 그러나 함수 내에서 함수 의 첫 번째 호출의 i초기 값에 상대적인 인덱스를 사용 str하고 있습니다.

함수를 올바르게 다시 작성하는 방법이 흥미 롭다고 확신합니다. 그렇지 않습니까?

이 함수는 아래의 데모 프로그램과 같이 다음과 같이 보일 수 있습니다.

#include <stdio.h>

#define MAX_LENGTH  100

int is_blank( char c )
{
    return c == ' ' || c == '\t';
}

char * capitalize( char *s )
{
    static size_t i = 0;

    if ( *( s + i ) )
    {
        if ( !is_blank( s[i] ) && ( i == 0  || is_blank( s[i-1] ) ) )
        {
            s[i] -= 'a' - 'A';
        }

        ++i;

        capitalize( s );

        --i;
    }

    return s;
}

size_t read_line( char *s, size_t n )
{
    int ch;
    size_t i = 0;

    while ( i + 1 < n && ( ch = getchar() ) != EOF && ch != '\n' )
    {
        s[i++] = ch;
    }

    s[i] = '\0';

    return i;
}

int main(void) 
{
    char s[MAX_LENGTH];

    read_line( s, MAX_LENGTH );

    puts( s );

    puts( capitalize( s ) );

    return 0;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

단어의 첫 글자 외에 문자열에서 두 글자 단어를 대문자로 바꾸려면 어떻게해야합니까?

분류에서Dev

각 파일의 첫 번째 줄에있는 첫 번째 문자가 공백, 탭 또는 줄 바꿈 인 디렉터리 트리의 모든 파일을 재귀 적으로 찾으려면 어떻게해야합니까?

분류에서Dev

목록에있는 모든 단어의 첫 글자를 대문자에서 소문자로 어떻게 변환합니까?

분류에서Dev

'\ cref'를 사용하는 동안 첫 글자를 대문자로 바꾸려면 어떻게해야합니까?

분류에서Dev

조건에 따라 모든 단어의 첫 글자를 대문자로 만들기

분류에서Dev

문자열에서 모든 단어의 첫 글자를 대문자로 쓰는 방법

분류에서Dev

현재 디렉토리에서 특정 확장자의 모든 파일을 재귀 적으로 삭제하려면 어떻게해야합니까?

분류에서Dev

XSLT 1.0에서 전체 단어가 대문자 인 경우 첫 글자 만 대문자로 표시하려면 어떻게해야합니까?

분류에서Dev

모든 단어의 첫 글자를 대문자로 표시하는 정규식

분류에서Dev

Lua에서 모든 단어의 첫 글자를 대문자로 표기

분류에서Dev

JS에서 모든 단어의 첫 글자를 대문자로 변환

분류에서Dev

Vim : 중괄호 사이의 모든 항목에 대해 ": sort"를 재귀 적으로 실행하려면 어떻게해야합니까?

분류에서Dev

ColdFusion의 모든 문장에서 첫 단어의 첫 글자를 대문자로 표시

분류에서Dev

열의 첫 문자를 기준으로 그룹이 계산되는 보고서를 만들려면 어떻게해야합니까?

분류에서Dev

Bash의 모든 기존 디렉토리에 Textures 디렉토리를 재귀 적으로 생성 한 다음 삭제하려면 어떻게해야합니까?

분류에서Dev

F #의 목록에서 모든 요소를 재귀 적으로 추가하려면 어떻게해야합니까?

분류에서Dev

디렉토리의 모든 이미지에서 exif 정보를 재귀 적으로 제거하려면 어떻게해야합니까?

분류에서Dev

Bash : 소문자로 변환하지만 모든 단어의 첫 글자의 대소 문자 유지

분류에서Dev

현재 어셈블리의 모든 EntityTypeConfiguration <>을 자동으로 추가하려면 어떻게해야합니까?

분류에서Dev

새로 만들기 전에 모든 자식 개체를 제거하려면 어떻게해야합니까?

분류에서Dev

다른 범위 함수를 호출하는 자바 스크립트 함수를 "재귀 적으로"문자열 화하려면 어떻게해야합니까?

분류에서Dev

자신의 폴더에 파일을 재귀 적으로 압축하려면 어떻게해야합니까?

분류에서Dev

모든 단어의 첫 글자를 대문자로 바꾸는 bash 스크립트 문제 해결

분류에서Dev

View 요소의 모든 Text 자식을 같은 스타일로 만들려면 어떻게해야합니까?

분류에서Dev

문자열의 모든 단어 뒤에 문자를 추가하려면 어떻게해야합니까?

분류에서Dev

한 번에 하나씩 단어의 문자를 대문자로 만든 다음 대문자로 된 단어의 각 인스턴스를 배열에 추가하려면 어떻게해야합니까?

분류에서Dev

콤보 박스에서 항목 텍스트의 첫 글자를 대문자로 바꾸려면 어떻게해야합니까?

분류에서Dev

괄호 안에있는 첫 단어의 첫 글자를 대문자로 표시

분류에서Dev

함수를 사용하여 문장의 모든 단어를 대문자로 바꾸려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    단어의 첫 글자 외에 문자열에서 두 글자 단어를 대문자로 바꾸려면 어떻게해야합니까?

  2. 2

    각 파일의 첫 번째 줄에있는 첫 번째 문자가 공백, 탭 또는 줄 바꿈 인 디렉터리 트리의 모든 파일을 재귀 적으로 찾으려면 어떻게해야합니까?

  3. 3

    목록에있는 모든 단어의 첫 글자를 대문자에서 소문자로 어떻게 변환합니까?

  4. 4

    '\ cref'를 사용하는 동안 첫 글자를 대문자로 바꾸려면 어떻게해야합니까?

  5. 5

    조건에 따라 모든 단어의 첫 글자를 대문자로 만들기

  6. 6

    문자열에서 모든 단어의 첫 글자를 대문자로 쓰는 방법

  7. 7

    현재 디렉토리에서 특정 확장자의 모든 파일을 재귀 적으로 삭제하려면 어떻게해야합니까?

  8. 8

    XSLT 1.0에서 전체 단어가 대문자 인 경우 첫 글자 만 대문자로 표시하려면 어떻게해야합니까?

  9. 9

    모든 단어의 첫 글자를 대문자로 표시하는 정규식

  10. 10

    Lua에서 모든 단어의 첫 글자를 대문자로 표기

  11. 11

    JS에서 모든 단어의 첫 글자를 대문자로 변환

  12. 12

    Vim : 중괄호 사이의 모든 항목에 대해 ": sort"를 재귀 적으로 실행하려면 어떻게해야합니까?

  13. 13

    ColdFusion의 모든 문장에서 첫 단어의 첫 글자를 대문자로 표시

  14. 14

    열의 첫 문자를 기준으로 그룹이 계산되는 보고서를 만들려면 어떻게해야합니까?

  15. 15

    Bash의 모든 기존 디렉토리에 Textures 디렉토리를 재귀 적으로 생성 한 다음 삭제하려면 어떻게해야합니까?

  16. 16

    F #의 목록에서 모든 요소를 재귀 적으로 추가하려면 어떻게해야합니까?

  17. 17

    디렉토리의 모든 이미지에서 exif 정보를 재귀 적으로 제거하려면 어떻게해야합니까?

  18. 18

    Bash : 소문자로 변환하지만 모든 단어의 첫 글자의 대소 문자 유지

  19. 19

    현재 어셈블리의 모든 EntityTypeConfiguration <>을 자동으로 추가하려면 어떻게해야합니까?

  20. 20

    새로 만들기 전에 모든 자식 개체를 제거하려면 어떻게해야합니까?

  21. 21

    다른 범위 함수를 호출하는 자바 스크립트 함수를 "재귀 적으로"문자열 화하려면 어떻게해야합니까?

  22. 22

    자신의 폴더에 파일을 재귀 적으로 압축하려면 어떻게해야합니까?

  23. 23

    모든 단어의 첫 글자를 대문자로 바꾸는 bash 스크립트 문제 해결

  24. 24

    View 요소의 모든 Text 자식을 같은 스타일로 만들려면 어떻게해야합니까?

  25. 25

    문자열의 모든 단어 뒤에 문자를 추가하려면 어떻게해야합니까?

  26. 26

    한 번에 하나씩 단어의 문자를 대문자로 만든 다음 대문자로 된 단어의 각 인스턴스를 배열에 추가하려면 어떻게해야합니까?

  27. 27

    콤보 박스에서 항목 텍스트의 첫 글자를 대문자로 바꾸려면 어떻게해야합니까?

  28. 28

    괄호 안에있는 첫 단어의 첫 글자를 대문자로 표시

  29. 29

    함수를 사용하여 문장의 모든 단어를 대문자로 바꾸려면 어떻게해야합니까?

뜨겁다태그

보관