2020. 4. 25.

[자료구조] 인프런 3. 문자열 예제 강의 정리


예제 1


//#pragma warning(disable:4996)
#include
#include
#include
//#include
#define MAX 20

int read_line(char str[], int limit);

int main(void)

// 이렇게 버퍼사이즈를 정해두고 하는게 보통이다.

{
char buffer[MAX];
while (1) {
printf("$ ");
//scanf("%s", &buffer);
// scanf는 단어단위로 입력을 받기때문에
// 두개이상의 단어는 받을 수가 없다.
// 공백문자로 짤라서 받음

//gets(buffer);
// gets 라인단위의 입력을 해주는 함수
// 앞뒤에 붙은 공백 문자까지 모두 카운트해주게 된다.
// gets 안전문제로 fgets를 쓰라고 추천한다.

/*fgets(buffer, MAX, stdin);*/
// 입력받을 크기를 정해줘야한다.
// 세번째 매개변수는 표준입력파일인 stdin
// 뉴라인 캐릭터도 포함한다.
/*buffer[strlen(buffer) - 1] = '\0';*/
// 문장을 읽고 엔터키가 저장되는것을 문자열이라고
// \0으로 바꿔줌으로써 원하는 데로 쓰는것이다.

read_line(buffer,MAX);
// 20글자까지만 받고 나머지는 무시하는 방법이 필요하다.
// 전적으로 컨트롤 가능한 함수를 만든다
// 라인단위로 입력을 받는 경우가 많다.


printf("%s:%d\n", buffer, strlen(buffer));
}
return 0;
}

int read_line(char str[], int limit)
{
int ch = 0 ;
int i = 0;
while ((ch = getchar()) != '\n')
// getchar 한문자씩 읽는 함수

if (i < limit)

str[i++] = ch;

str[i] = '\0';
return i;

}




연습 2

문장의 앞과 뒤에 붙은 공백문자들은 제거하고 단어 사이에 이상의 연속된 공백문자들은 하나의 공백 문자로 대체하라.



압축하기


공백이 아닌 문자를 하나로 처리하고 공백이 아닌 문자는 저장한다.


#include
#include


int read_line_with_compression(char compressed[], int limit);

int main() {
char line[80];
while(1)
{
printf("$ ");
int length = read_line_with_compression(line, 80);
printf("%s : %d", line, length);

}
return 0;
}

int read_line_with_compression(char compressed[], int limit) {
int ch, i = 0;
while ((ch = getchar()) != '\n')
// 한문자씩 읽어서 줄바꿈 문자가 아닌동안 ch 넣는다
{
if (i < limit - 1 && (!isspace(ch) || i > 0
// limit - 1 이유는 뒤에 공백문자가 들어갈 공간이 필요하다
// isspace함수는 화이트스페이스인지 확인해준다.
// 화이트스페이스란 공백문자나 탭문자를 이야기한다.
// || 공백인 경우에는
// i>0 아직 공백인 문자가 하나도 입력이 되지 않았다면 무시
&& !isspace(compressed[i - 1])))
// 직전문자가 공백아니라면 공백문자를 저장해준다.
compressed[i++] = ch;
}
if (i > 0 && isspace(compressed[i - 1]))
// i=0 상태에서
// 런타임오류가 나타날수 있음
i--;
compressed[i] = '\0';
return i;
}


댓글 없음:

댓글 쓰기