언어 자료구조 알고리즘/디딤돌 C언어

[C언어] 68. 문자열

언제나휴일 2016. 4. 17. 16:05
반응형



문자열


프로그램을 작성하다 보면 문자열 데이터를 사용할 때가 많아요.
대부분의 프로그래밍 언어에서는 문자열을 관리하는 별도의 형식을 제공하지만 C언어는 문자열 형식을 제공하지 않아요.
 
그렇다고 C언어에서 문자열 데이터를 표현할 없는 것은 아니예요.
C언어에서는 문자열을 char 형을 원소로 하는 배열이나 char 형을 원소로 하는 포인터 형식으로 문자열을 표현할 있어요.
그리고 문자열 데이터를 표현할 쉽게 표현할 있게 따옴표를 사용하여 문자열을 표현할 있어요.
 
#define MAX_NAME_LEN 50
char name[MAX_NAME_LEN + 1] = "hello";
const char *str = "yahoo";
 
char 형식 원소로 배열을 선언하면 문자열을 구성하는 문자 데이터를 기억하는 메모리를 할당하여 조회 변경이 가능하죠.
하지만 char 형을 원소로 하는 포인터는 데이터를 기억하는 저장소의 역할을 하는 것은 아니예요.

예를 들어 char 형을 원소로 하는 개의 배열의 초기값을 “hello” 설정하면 각각의 배열을 위해 할당한 메모리에 독립적으로 문자열을 설정해요.
그리고 각각의 배열의 원소에 접근하여 변경하는 것이 가능하죠.
 
하지만 개의 포인터 변수에 초기값을 “yahoo” 설정하면 읽기 전용 메모리에 문자열을 배치한답니다.
그리고 개의 포인터 변수는 해당 메모리 주소를 값으로 갖는 것이죠.
읽기 전용 메모리에 할당한 문자열을 문자열 리터럴 상수라 부르며 내용을 변경할 없어요.

 

배열과 포인터를 이용한 문자열 사용
#include <stdio.h>
int main()
{
   
char name1[6]="hello";
   
char name2[6]="hello";
   
const char *str1 = "yahoo";
   
const char *str2 = "yahoo";
 
    printf(
"name1: %p name2:%p\n",name1,name2);
    printf(
"str1: %p str2:%p\n",str1,str2);
 
    name1[0] =
'y';
   
//str1[0] = 'k'; //값을 변경할 없음
    printf(
"name1: %s name2: %s\n",name1,name2);
    printf(
"str1: %s str2: %s\n",str1,str2);
   
return 0;
}
실행 결과
name1: 0023FD90 name2: 0023FD80
str1: 00EA5848 str2: 00EA5848
name1: yello name2: hello
str1: yahoo str2: yahoo


문자열


  

따라서 포인터로 문자열 변수는 char 배열을 인자로 전달받거나 문자열 리터럴 상수로 초기화할 사용하세요.
 
C
언어에서 문자열을 형식으로 제공하는 것이 아니라서 문자열을 복사하거나 비교하는 연산자는 제공하지 않아요.
때는 char 형식을 원소로 하는 포인터 형식과 더하기 연산, 간접 연산, 인덱스 연산 등을 이용하여 처리하세요.
그리고 문자열 관련 라이브러리 함수를 이용하면 이러한 작업을 쉽게 있어요.
이들을 사용하려면 string.h 파일을 포함하세요.
이번 장에서는 문자열을 선언하고 관련 함수들을 사용하는 방법을 다루기로 할게요.
 
배열과 포인터를 이용한 문자열 사용
#include <stdio.h>
#include <string.h>
int main()
{
   
char name[10]="";
    strcpy(name,
"hello");
    printf(
"이름:%s\n",name);
    printf(
"문자열 길이:%d\n", strlen(name));
   
if(strcmp(name,"hello")==0)

    {

        printf("차이가 없다.\n");

    }
   
else

    {

        printf("차이가 있다.\n");

    }
   
return 0;
}

실행 결과
이름:hello
문자열 길이:5
차이가 없다.

반응형