나는 이것을 어떻게 만들 수 있는지 궁금합니다. 반복이나 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
내 코드에 어떤 문제가 있습니까?
코드가 잘못되었습니다. 예를 들어 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] 삭제
몇 마디 만하겠습니다