728x90
1. 리턴을 제외한 입력문장을 그대로 출력한 후 문장의 길이를 출력한다.
(단, 공백문자도 포함해 카운트하며 문장의 앞뒤에 붙은 공백까지 그대로 출력한다.)
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 20
int readline(char str[], int lim) {
int ch, i = 0;
while ((ch = getchar()) != '\n') // 한 문자씩 입력 받음
if (i < lim - 1)
str[i++] = ch;
str[i] = '\0';
return i;
}
int main() {
char buffer[BUFFER_SIZE];
while (1) {
printf("$ ");
//fgets(buffer, BUFFER_SIZE, stdin); // 라인 단위의 입출력, stdin(표준파일), BUFFER_SIZE까지만 읽음
//buffer[strlen(buffer)-1] = '\0';
readline(buffer, BUFFER_SIZE);
printf("%s:%d\n", buffer, strlen(buffer));
}
}
* scanf() : 단어 단위
* gets() : 문장 단위
* fgets() : 문장 단위
* buffer[strlen(buffer) - 1] 에 0으로 초기화하는 이유?
: fgets() 함수는 줄바꿈 문자를 포함해 배열에 저장하기 때문임.
* readline() : 위의 과정을 포함해 만든 함수
2. 공백문자들이 문장의 앞, 중간, 뒤에 포함되어 있을 때, 공백문자들을 제거해 출력한다.
(단, 단어 사이에 두 개 이상의 공백문자들은 하나의 공백 문자로 대체한다.)
- 공백 제거 아이디어
1) 문장의 앞 : i가 0인 경우는 무시함.
2) 문장의 중간 : i가 0보다 큰 경우 (i-1)번째가 공백이 아닐 때 배열에 포함.
3) 문장의 뒤 : i가 0보다 크면서 (i-1)번째가 공백일 때 i--
#include <stdio.h>
#include <ctype.h>
#define BUFFER_SIZE 80
int readline(char str[], int lim) {
int ch, i = 0;
while ((ch = getchar()) != '\n') { // 한 문자씩 입력 받음
if (i < lim - 1 && (!isspace(ch) || i > 0 && !isspace(str[i - 1])))
str[i++] = ch;
}
if (i > 0 && isspace(str[i - 1])) // 마지막 문자가 공백일 때
i--;
str[i] = '\0';
return i;
}
int main() {
char buffer[BUFFER_SIZE];
while (1) {
printf("$ ");
int length = readline(buffer, BUFFER_SIZE);
printf("%s:%d\n", buffer, length);
}
}
728x90
'CS > 자료구조' 카테고리의 다른 글
[자료구조] 전화번호부 v2.0 (0) | 2022.09.18 |
---|---|
[자료구조] 전화번호부 v1.0 (0) | 2022.09.18 |
[자료구조] Graph(그래프) - 최단 경로 알고리즘(벨만 포드, 다익스트라, 플로이드) (0) | 2022.06.20 |
[자료구조] Graph(그래프) - DAG (0) | 2022.06.02 |
[자료구조] Graph(그래프) - 깊이우선순회 DFS (0) | 2022.06.02 |