예제 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;
}
댓글 없음:
댓글 쓰기