본문 바로가기

programming language/C 언어

배열기반의 문자열 표현 문제 11-2(영단어 길이계산)

-윤성우 열혈 c 프로그래밍-

 

문제 1 영단어를 입력받아 그 영단어의 길이를 계산하여 출력하는 프로그램을 작성하는 문제이다.

널문자가 문자열의 끝에 있으므로 이와 같이 문장을 구성할 수 있다.

위 37~39행의 과정은 영단어의 길이를 출력하는 과정이지, 문자열 배열의 길이를 출력하는 과정이 아니다.

 

위 문제를 풀던 중 반복문에 대한 개념이 헷갈려 반복문에 대한 고민을 해보았다.

위는 for반복문인데, is = 5가 될 때 for문을 탈출한다 왜냐하면 (is < 5)라는 조건식이 있기 때문이다.

그러면 9행에서 출력되는 is의 값은 4 일까? 그것은 출력 결과를 통해 아니라는 답을 얻을 수 있다.

is = 5인 상태에서 for문을 나온 것이므로 위 9행의 출력 결과는 5 인 것이다.

 

문제 2 프로그램 사용자로부터 영단어 입력받아, char형 배열에 저장받은 후, 그 배열에 저장된 영단어를 역순으로 뒤집어라. 물론, 이때 널문자의 위치는 변경해선 안된다. 뒤집고 나서 제대로 뒤집혔는지 확인을 위해 출력해보자.

위 14행에서 왜 조건식에 i < Len/2 가 있을까?  그 이유를 예로 들어보면

apple이라는 영단어를 입력받았다 할 때 가운데 p는 영단어를 역순으로 뒤집어도(앞 뒤를 바꾸어도) 그 자리 그대로 위치한다.

apple의 경우 Len = 5(영단어의 길이)인데 이를 /2 해줬을 경우 2.5이다.

이때, i는 int형 변수이므로 위 for문에서 0, 1이 될 수 있는 것이다.  

처음 i = 0일 때 제일 앞 A와 제일 뒤 e를 바꾸고 i = 1일 때 A 뒤의 p와 e앞의 l이 바뀌게 된다. 

 

16행은 앞의 문자를 아까 선언해두었던 temp라는 문자형 변수에 임시로 저장해 둔다는 뜻이다.

17행은 뒤의 문자를 앞으로 저장한다는 뜻이다.

18행은 앞의 문자를 뒤로 저장한다는 뜻이다. 

 

우리가 보통 변수에 값을 입력할 때 int num = 20;처럼 오른쪽 값이 왼쪽으로 저장되는 것 을 볼 수 있는데

위 16~18행도 이와 같이 이해를 해주면 편하다.

 

17행을 보면 arr[(Len - i) -1]이 있는데, 우선 arr [5]는 위 배열의 여섯 번째 요소인 널문 자이다. (왜냐하면 인덱스 넘버는 0부터 시작이기 때문.) 그러므로 뒤에 -1을 통해 arr [4]가 되게 해 줘 5번째 요소인 e를 가리키게 해 준다. 

(Len - i)에서 -i 가 있는 이유는 반복문을 이용해 주기 위해서 이다.

 

<밑에 풀이는 정답이 아닌 처음 시도하였던 풀이이다.>

언뜻 보면 영단어를 거꾸로 출력하라는 조건을 만족하였기 때문에 정답으로 보이지만, 문제에서 또 다른 조건으로 널 문자의 위치를 변경하여서는 안된다.라고 하였다. 그렇기 때문에 문자 하나하나를 출력하게 되어, 마지막 결괏값에 널문자가 존재하지 않게 되는 이 풀이는 옳지 않다.(english단어를 기준으로 6~>0까지 출력을 하기 때문이다.)