앞선 연습문제 1과 비슷하나 세부내용이 조금 다르다
문제 2.
프로그램을 실행하면 '$ ' 와 같이 $와 한칸의 공백문자를 출력하고 사용자의 입력을 기다린다.
ex) $
입력받은 문자중 문장의 앞, 뒤에 붙은 공백은 제거 한다.
ex) $ hello
hello:5
중간에 두개 이상의 공백이 들어갈 경우 연속된 공백문자는 하나의 공백으로 대체한다.
ex) $ hello world
hello world:11
' abc de ' 의 형태로 입력받은 데이터를 문제에 맞도록 구현하여 출력하려면,
'abc de' 의 데이터만 추출하여 별도의 배열에 저장하여 출력한다.
' abc de ' 문자열 중 앞의 ' '공백은 제거한 후 'abc' 값만 저장한다.
문자열의 중간에 있는 공백이 여러개일 경우 한개만 저장하고 나머지는 저장하지 않기 때문에,
첫번째 공백은 저장한다.
문자열 중간의 있는 공백은 한번만 저장하므로 compressed 의 직전 문자가 공백이라면 다음 공백은 저장하지 않는다.
위와같은 과정을 구현하기 위해서는 별도의 UDF를 생성하여 구현한다.
//example02.c #include <stdio.h> #include <string.h> #include <ctype.h> void main() { char line[80]; int length; while(1) { printf("$ "); length = read_line_with_compression(line, 80); printf("%s:%d\n",line, length); } } int read_line_with_compression (char compressed[], int limit) { int ch, i = 0; while ((ch = getchar()) != '\n') { if(i < limit-1 && (!isspace(ch) || i > 0 && !isspace(compressed[i-1]))) compressed[i++] = ch; } if (i > 0 && isspace(compressed[i-1])) i--; compressed[i] = '\0'; return i; } |
isspace 함수는 해당 문자가 스페이스, 개행문자 등 whitespace 인지를 판별하는 함수이다.
해당 함수를 사용하기 위해서는 ctype.h 라이브러리를 사용한다.
문자열을 문자단위로 검사하여 조건에 맞는것만 compress 배열에 저장한다.
i < limit-1 && (!isspace(ch) || i > 0 && !isspace(compressed[i-1]))
문자열의 끝이 아니면서 (i < limit-1)
공백이 아니거나(isspace(ch)
문자열의 시작이 아니면서 (i>0)
직전 문자가 공백이 아닌것(!isspace(compressed[i-1])
위 조건을 해당하는 문자만 compress 배열에 저장하도록 한다.
요약하자만 이번에 검사할 문자가 맨 앞글자가 아니면서 바로 직전의 문자가 공백이 아니거나 해당 문자가 공백이 아닐경우에만 배열에 넣는다.
i > 0 && isspace(compressed[i-1])
while 조건을 모두 만족하고 빠져나온 뒤에는 마지막 문자가 공백일 경우 불필요한 공백이 들어가게 되므로 마지막 값이 공백일 경우를 검사하여 마지막 값이 공백일 경우에는 공백값을 '\0'으로 넣어 문자열의 마지막을 의미하게 한다.
다음은 ' a ' 라는 문자열을 입력하였을 때 공백이 압축되는 과정이다.
1. 직전 저장된 문자가 공백이 아닌데 공백이기에 저장되지 않음.
2. 마찬가지로 직전 저장된 문자가 공백이 아니기에 공백이 저장되지 않음. (문자열 앞의 공백 제거 성공)
3. 문자열의 마지막이 아니면서 공백문자가 아니기에 저장 가능
4. 직전 문자가 공백이 아닌 문자기에 공백이라도 저장 가능
5. 직전문자가 공백으로 저장되었기에 공백 저장 불가
6. 마지막문자가 공백이기에 '\0' 입력하고 종료
실제 소스를 실행하여 ' abc de ' 를 입력한 것과 ' a ' 를 입력한 결과는 다음과 같다.
![]() |
' abc de ' -> abc 앞의 공백은 삭제되고 중간공백은 한개로 압축되었으며 뒤의 공백은 삭제되었다.
' a ' -> a 앞의 공백은 삭제되고 뒤의 공백도 삭제된다.
'자료구조' 카테고리의 다른 글
strdup 와 strcpy 의 차이점은? (feat. 전화번호부 만들기 V1) (0) | 2022.11.21 |
---|---|
전화번호부 만들기 V1 (0) | 2022.11.21 |
문자열 연습문제 -1 (2) | 2022.11.17 |
문자열 - 3 (0) | 2022.11.17 |
문자열 - 2 (0) | 2022.11.17 |