문자열과 배열

  • 문자열(string) 자료형의 데이터 = 사실 문자(char) 자료형의 데이터들의 배열
  • string s = “HI!”; 과 같이 문자열 s가 정의되어 있다고 생각해보면,
  • s는 문자의 배열이기 때문에 메모리상에 아래 그림과 같이 저장되고, 인덱스로 각 문자에 접근할 수 있다.

 

 

 

  • 가장 끝의 ‘\0’ = 문자열의 끝을 나타내는 널 종단 문자
  • 단순히 모든 비트가 0인 1바이트를 의미함

 

※ 아래 코드와 같이 여러 문자열이 동시에 선언된 경우

 

 

  • names라는 문자열 형식의 배열에 네 개의 이름이 저장되어있다.
  • 첫 번째 printf에서는 names의 첫번째 인덱스의 값, 즉 “EMMA”를 출력
  • 두 번째 printf에서는 형식 지정자가 %s가 아닌 %c로 설정되어 있음
  • 따라서 출력하는 것은 문자열이 아닌 문자
  • 여기서는 각 이름의 두번째 문자를 출력하고자 한다.
  • 이는 names[0][1]과 같이 2차원 배열을 통해 접근할 수 있다.
  • 다시 말해 names[0][1]는 names의 첫 번째 값, 즉 “EMMA”라는 문자열에서, 그 두번째 값, 즉 ‘M’ 이라는 문자를 의미

 

아래 그림에서 names가 실제 메모리상에 저장된 예시와 해당하는 인덱스를 확인할 수 있다.

 

 

문자열의 활용

 

① 문자열의 길이 및 탐색

  • 사용자로 부터 문자열을 입력받아 한 글자씩 출력하는 프로그램 만들기
  • 간단하게 for 루프를 통해 문자열의 인덱스를 하나씩 증가시켜가면서 해당하는 문자를 출력하면 되는데,
  • 문자열의 끝을 알 수 있는 방법은 ? 해당하는 인덱스의 문자가 널 종단 문자, 즉 ‘\0’와 일치하는지 검사하는 것
  • 즉, s라는 문자열이 있다고 할 때 for (int i = 0; s[i] != ‘\0’; i++) { ..} 과 같은 루프를 사용하면 된다.
  • 하지만 아래 코드와 같이 strlen() 이라는 함수를 사용할 수도 있다.

  • strlen = 문자열의 길이를 알려주는 함수, string.h 라이브러리 안에 포함되어 있음
  • 위 코드에서는 n이라는 변수에 문자열 s의 길이를 저장하고, 해당 길이 만큼만 for 루프를 순환
  • → 일일이 널 종단 문자를 검사하는 것 보다 훨씬 효율적!

 

② 문자열 탐색 및 수정

 

< 사용자로부터 문자열을 입력받아 대문자로 바꿔주는 프로그램 >

 

  • 먼저 사용자로부터 입력받은 문자를 s라는 변수에 저장
  • 그리고 s의 길이만큼 for 루프를 돌면서, 각 인덱스에 해당하는 문자가 ‘a’보다 크고 ‘z’보다 작은지 검사
  • 즉, 소문자인지 검사하는 것과 동일
  • 여기서 문자의 대소비교가 가능한 이유는 ASCII값, 즉 그 문자가 정의되는 ASCII 코드 상에서의 숫자값으로 비교할 수 있기 때문
  • 또한 알파벳의 ASCII 값을 잘 살펴보면 각 알파벳의 소문자와 대문자는 32씩 차이가 남을 확인할 수 있다.
  • 따라서 각 문자가 소문자인 경우 그 값에서 32를 뺀 후에 ‘문자’ 형태로 출력하면 대문자가 출력이 된다.
  • 각 문자가 이미 대문자인 경우는 그냥 그대로 출력

 

※ 이와 동일한 작업을 수행하는 함수가 ctype 라이브러리에 toupper() 이라는 함수로 정의되어 있다. (아래 코드 참조)

 

 

명령행 인자

  • main도 그 형태를 보면 하나의 함수 ! 
  • main() 안에 기계적으로 void 라고 입력하는 대신 아래 코드와 같이 argc, argv 를 정의해 보면,

 

 

  • 첫번째 변수 argc는 main 함수가 받게 될 입력의 개수
  • 그리고 argv[]는 그 입력이 포함되어 있는 배열
  • 프로그램을 명령행에서 실행하므로, 입력은 문자열로 주어진다. 따라서 argv[]는 string 배열이 됨
  • argv[0]는 기본적으로 프로그램의 이름으로 저장
  • 만약 하나의 입력이 더 주어진다면 argv[1]에 저장될 것
  • 예를 들어 위 프로그램을 “arg.c”라는 이름으로 저장하고 컴파일 한 후 “./argc”로 실행해보면 “hello, world”라는 값이 출력됨
  • 명령행 인자에 주어진 값이 프로그램 이름 하나밖에 없기 때문
  • 하지만 “./argc David”로 실행해보면 “hello, David”라는 값이 출력됩니다.
  • 명령행 인자에 David라는 값이 추가로 입력되었고, 따라서 argc 는 2, argv[1] 은 “David”가 되기 때문

+ Recent posts