문자열 다루기
C 언어에서는 문자 데이터 타입은 char
를 제공하지만 문자열 데이터 타입은 기본으로 제공하고 있지 않습니다. 문자열을 처리하기 위해서는 문자 배열 또는 문자 포인터를 사용합니다.
이번에는 C 언어에서의 문자열 처리에 대한 내용을 정리하겠습니다.
문자열 관련 함수로 문자열의 길이 반환, 문자열의 공백 제거, 대/소문자로의 변환 등의 기능을 하는 함수 등을 제공합니다.
> // 문자 배열을 사용하여 문자열 다루기
NOTE
C#/Java, Python과 같은 프로그래밍 언어는 문자열을 바로 문자열 변수에 저장할 수 있습니다. 하지만, C 언어는 이 방법을 사용할 수 없어 문자열 처리가 어려운 편입니다.
String name = "VisualAcademy";
25.1 문자 배열로 문자열 처리하기
C 언어는 문자열 데이터 타입을 제공하고 있지 않습니다. 문자열을 보관하고 사용하고자 한다면 문자열이 저장될 크기만큼 미리 문자 배열을 만들고 이곳에 문자열을 저장하고 사용하면 됩니다. 문자열을 저장할 배열의 크기는 저장할 문자열보다 반드시 1
만큼 더 커야 합니다. 그 이유는 문자 배열의 마지막 항목은 null
또는 '\0'
로 표현되는 널 종결 문자가 포함되어 문자열의 끝을 나타냅니다.
코드에서 다음 한 줄을 입력하여 s
배열로 문자열을 저장할 수 있습니다.
char s[7] = "CODE";
이렇게 생성된 s
배열을 그림으로 표현해보면 다음과 같습니다.
그림: 문자 배열로 문자열 처리하기
다음 코드를 작성 후 실행해보세요.
코드: CharArrayDemo.c
#include <stdio.h>
int main(void)
{
char s[7] = "CODE";
putchar(s[0]);
putchar(s[1]);
putchar(s[2]);
putchar(s[3]);
putchar('\n');
return 0;
}
CODE
문자 배열에 문자열 리터럴을 대입하면, 문자열 마지막에 널 종결 문자인 '\0'
가 포함됩니다. 현재 예제에서는 문자 배열에서 직접 인덱스를 사용해서 4개의 문자를 뽑아서 출력해 보았습니다.
코드: StringVariable.c
#include <stdio.h>
int main(void)
{
char message[80] = "hello, world!";
printf("%s\n", message);
return 0;
}
hello, world!
문자 배열에 문자열을 저장할 때에는 반드시 선언과 동시에 초기화 시켜야 합니다. 그리고 배열의 첨자는 충분한 크기를 지정하거나 입력할 문자열보다 1
큰 값으로 설정해야 합니다. 문자열의 출력은 %s
서식 지정자와 문자 배열의 이름을 사용합니다.
TIP
scanf
함수로 문자열을 입력 받을 때 문자의 최대 개수를 다음과 같은 형태의 서식 지정자를 사용하여 지정할 수 있습니다.
char name[80];
scanf("%25s", name);
문자 배열에 수작업으로 문자열 입력하고 출력하기
만약, 문자 배열을 선언만하고 나중에 문자열로 초기화할 때에는 문자 배열의 인덱스를 사용하여 각각의 문자를 초기화할 수 있습니다. 이 때에는 문자열의 마지막을 의미하는 null 종결 문자
인 '\0'
를 반드시 입력해야합니다.
코드: CharArrayInitialize.c
#include <stdio.h>
int main(void)
{
char code[5];
code[0] = 'C'; // 문자 하나씩 입력
code[1] = 'o';
code[2] = 'd';
code[3] = 'e';
code[4] = '\0'; // 문자열의 끝을 나타내는 NULL 종결 문자
printf("%s\n", code);
return 0;
}
Code
문자 배열에 문자 하나씩 초기화하는 예제를 살펴보았습니다. 하지만, 실제로는 이렇게 사용할 일은 거의 없습니다.
문자열 변수 선언 및 사용하기
C 언어에서 문자열 변수를 선언하려면 char
포인터를 사용합니다.
다음 코드를 작성 후 실행해보세요.
코드: CharPointer.c
#include <stdio.h>
int main(void)
{
char* message = "Hello World";
printf("%s\n", message);
return 0;
}
Hello World
char*
형식을 사용하면 하나 이상의 문자열 리터럴을 보관해 놓는 그릇을 만들 수 있습니다. 이 때 반드시 선언과 동시에 문자열로 초기화해야 합니다. 문자열을 출력하는 자리 표시자는 %s
를 사용합니다.
null 종결 문자(Terminating Null Character)
문자열 리터럴의 끝에는 눈에 보이지 않게 null
종결 문자가 추가됩니다. null
종결 문자는 NULL
또는 \0
로 표현합니다.
코드: TerminatingNullCharacter.c
// null 종결 문자
#include <stdio.h>
int main(void)
{
return 0;
}
문자열에서 문자 하나씩 뽑아 출력하기
문자열은 다른 표현으로 문자의 배열을 나타냅니다. 그래서 배열의 인덱스를 사용하여 문자열에서 문자 하나씩을 뽑아 사용할 수 있습니다. 다음 코드를 작성 후 실행해보세요.
코드: CharPointerIndex.c
// 문자열에서 문자 하나씩 뽑아 출력하기
#include <stdio.h>
int main(void)
{
char* name = "C Language";
printf("%c ", name[0]);
printf("%c%c%c%c\n", name[2], name[3], name[4], name[5]);
return 0;
}
C Lang
문자열에서 인덱스를 사용하여 문자 하나씩을 뽑아서 사용해 보았습니다. 이 때 주의할 점은 인덱스를 벗어나는 값을 요청하지 말아야 합니다.
문자열 복사 함수(strcpy) 사용하기
C 언어에서는 문자 배열에 문자열 리터럴을 직접 할당할 수 없습니다.
이러한 경우에는 string.h
헤더 파일에 선언되어 있는 문자열 복사(String Copy)를 의미하는 strcpy()
함수를 사용해서 문자 배열에 문자열을 저장할 수 있습니다. 즉, 문자열 복사는 strcpy()
함수를 사용합니다.
strcpy()
함수의 시그니처는 다음과 같습니다.
char* strcpy(char *_Dest, char const *_Source);
strcpy(대상문자열, 원본문자열)
- 원본문자열을 대상문자열로 복사합니다.
다음과 같이 strcpy
를 사용하여 문자 배열에 문자열을 할당하는 예제를 만들고 실행해보세요.
코드: string_copy.c
#define _CRT_SECURE_NO_WARNINGS // strcpy() 보안 경로로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h> // strcpy() 함수가 선언된 헤더 파일
int main(void)
{
char messages[6]; // 크기가 6인 문자 배열 선언
// 문자 배열에 문자열 리터럴을 초기화할 때에는 strcpy() 함수 사용
strcpy(messages, "C/C++");
printf("%s\n", messages);
return 0;
}
C/C++
C 언어는 다음과 같이 문자 배열에 직접 문자열 리터럴을 대입해서 초기화할 수 없습니다.
messages = "C/C++";
배열에 문자열 복사가 필요한 경우에는 strcpy
함수를 사용해서 두 번째 매개 변수의 문자열을 첫 번째 매개 변수의 배열에 복사하면 됩니다.
strcpy(messages, "C/C++");
여기서 주의할 점은, messages
배열의 크기가 6
이기에 NULL
종결 문자열이 포함되어야 하기 때문에 strcpy
함수로 5
자까지만 저장할 수 있습니다.
C 언어 문자열 복사 함수(strcpy, strncpy, strdup) 사용하기
C 언어의 string.h
헤더 파일에서 제공하는 문자열 복사 함수를 소개합니다.
strcpy()
함수는 "string copy"의 의미로 문자 배열에 문자열을 복사하고 strncpy()
함수는 "string n copy"의 의미로 문자 배열에 n
개의 문자열을 복사하고 strdup()
함수(_strdup
)는 "string duplicate"의 의미로 반환값으로 문자열 포인터 변수에 문자열을 복사합니다.
strcpy()
, strncpy()
, strdup()
함수의 시그니처는 다음과 같습니다.
char *strcpy (char *__dest, const char * __src)
char *strncpy (char *__dest, const char *__src, size_t __n)
char *strdup (const char *__s)
문자열을 복사하는 예제를 살펴보겠습니다.
코드: string_copy_etc.c
//[?] 문자열 복사 함수 사용하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h> // strcpy(), strncpy(), strdup() 함수가 정의되어 있는 헤더 파일
int main(void)
{
char buffer1[80] = "";
char buffer2[80] = "";
char* buffer3;
strcpy(buffer1, "C Programming"); // 문자 배열에 문자열 복사
strncpy(buffer2, buffer1, 9); // 문자 배열에 n개의 문자열 복사
buffer3 = _strdup("C Language"); // 문자열 포인터에 문자열 복사
printf("%s\n", buffer1); // C Programming
printf("%s\n", buffer2); // C Program
printf("%s\n", buffer3); // C Language
return 0;
}
C Programming
C Program
C Language
strcpy
함수를 기준으로 strncpy
함수는 n개의 문자만 복사하고 _strdup
함수는 반환값으로 문자열 포인터에 문자열을 복사합니다.
일단 3개의 문자열 복사 함수 이름을 먼저 기억해 놓고 넘어가겠습니다.
문자열 연결
코드: strcat_strncat.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char buffer1[80] = "C ";
char buffer2[80] = "C ";
strcat(buffer1, "Programming"); // 문자열 연결
printf("%s\n", buffer1); // C Programming
strncat(buffer2, "Programming", 7); // 문자열 n개 연결
printf("%s\n", buffer2); // C Program
return 0;
}
C Programming
C Program
문자열 뒤집기 기능 구현하기
이번 예제는 문자열을 뒤집는 기능을 구현하는 방법을 간단하게 살펴보겠습니다.
코드: reverse_str.c
#include <stdio.h>
#include <string.h>
int main(void)
{
// 입력 받을 문자열을 저장할 변수 선언
char str[100];
// 사용자에게 문자열을 입력 받음
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin); // fgets 함수를 사용하여 최대 100개의 문자를 입력 받음
// 입력 받은 문자열의 길이를 구함
int length = strlen(str);
// 문자열의 첫 문자와 마지막 문자, 두 번째 문자와 마지막에서 두 번째 문자 등을 교환하여 문자열을 뒤집음
for (int i = 0; i < length / 2; i++)
{
char temp = str[i]; // 임시 변수에 현재 문자를 저장
str[i] = str[length - i - 1]; // 현재 위치의 문자를 대응되는 문자로 교체
str[length - i - 1] = temp; // 대응되는 위치의 문자를 임시 변수에 저장한 문자로 교체
}
// 뒤집힌 문자열 출력
printf("뒤집힌 문자열: %s\n", str);
return 0;
}
문자열을 입력하세요: hello
뒤집힌 문자열:
olleh
위 코드를 통해 문자열 뒤집기 기능을 간단히 구현해 보았습니다. 기본적인 문자열 조작 기술을 사용하여 문자열의 첫 번째 문자와 마지막 문자, 두 번째 문자와 마지막에서 두 번째 문자 등을 교환하는 방식으로 해결할 수 있습니다.
문자열 뒤집기: _strrev 함수 활용하기
이번 예제에서는 _strrev 함수를 사용하여 문자열을 뒤집는 방법을 살펴보겠습니다.
코드: reverse_str_strrev.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
// 입력 받을 문자열을 저장할 변수 선언
char str[100];
// 사용자에게 문자열을 입력 받음
printf("문자열을 입력하세요: ");
scanf("%s", str); // scanf 함수를 사용하여 문자열을 입력 받음
_strrev(str); // _strrev 함수를 사용하여 문자열 뒤집기
// 뒤집힌 문자열 출력
printf("뒤집힌 문자열: %s\n", str);
return 0;
}
문자열을 입력하세요: Hello
뒤집힌 문자열: olleH
이 코드는 사용자로부터 입력 받은 문자열을 _strrev 함수를 활용하여 뒤집은 후 출력합니다. 다만, _strrev 함수는 표준 C 라이브러리에는 포함되어 있지 않고 Visual Studio 환경에서만 사용할 수 있습니다.
퀴즈
문자열을 선언하는 방법으로 맞는 것은?
char message = '안녕하세요.';
char message = "안녕하세요.";
char* message = "안녕하세요.";
char* message = 안녕하세요.;
문자열을 출력하는 자리표시자는?
%s
%p
%c
%d
문자열의 끝을 나타내는 종결 문자를 모두 고르세요.
NULL
\0
\n
\t
strlen()
함수로 문자열의 길이 구하기
이번에는 string.h
헤더 파일에 선언되어 있는 strlen()
함수를 사용하여 문자열의 길이 구하는 방법을 살펴보겠습니다.
strlen
함수의 이름은 문자열 길이를 의미하는 string length에서 유래되었습니다.
strlen
함수의 시그니처는 다음과 같습니다.
size_t strlen(onst *_Str)
코드에서는 다음과 같이 사용되고 실행 결과로 문자열의 길이가 반환됩니다.
strlen(문자배열)
strlen(문자열포인터)
코드: StrLen.c
//[?] 문자열의 길이: strlen()
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[20] = "C Language"; // 10
printf("%s -> %d\n", str, strlen(str));
return 0;
}
C Language -> 10
string.h
파일을 참조한 후 strlen(str)
형태로 문자 배열의 이름을 전달하면 strlen
함수는 문자열의 길이를 알려줍니다. "C Language" 문자열은 공백을 포함하여 10글자이므로 10이 반환됩니다. 문자 배열의 끝에 포함되는 NULL 종결 문자는 문자열 길이에 포함되지 않습니다.
TODO: 그림: strlen 함수로 문자열 길이 구하기
한글 문자열의 길이 구하기
C 언어에서는 영문과 한글에 대해서 문자열의 길이를 서로 다르게 표현합니다.
기본적으로 영문은 1Byte
로, 한글은 한 글자를 2Byte
로 표현합니다.
다음 코드를 작성 후 실행해보세요.
코드: StringLength.c
//[?] 문자열의 길이: strlen()
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[20] = "Hello."; // 6
char* s2 = "안녕하세요."; // 11
printf("%s -> %d\n", s1, strlen(s1));
printf("%s -> %d\n", s2, strlen(s2));
return 0;
}
Hello. -> 6
안녕하세요. -> 11
실행 결과처럼 C 언어는 영문은 한 글자를 1Byte
로, 한글은 한 글자를 2Byte
로 계산하여 문자의 개수를 알려줍니다.
"안녕하세요." 문자열에서 한글이 아닌 .
과 같은 기호는 1Byte
로 계산됩니다.
strlen()
함수를 사용하여 문자열 길이 계산하기
이 글에서는 C 언어에서 strlen()
함수를 사용하여 문자열의 길이를 계산하는 방법에 대해 알아보겠습니다.
strlen()
함수 소개
strlen()
함수는 C 표준 라이브러리의 <string.h>
헤더 파일에 정의되어 있습니다. 이 함수는 문자열의 길이를 계산하여 size_t
타입의 값을 반환합니다. 문자열의 길이는 널 종료 문자(\0
)를 제외한 문자 수입니다.
예제 코드
다음은 strlen()
함수를 사용하여 문자열 길이를 계산하는 예제 코드입니다.
코드: string_length_example.c
// 문자열 길이 : strlen() : String Length
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *str = " Abc Def Fed Cba "; // 앞뒤로 공백 하나씩 추가
puts(str);
printf("문자열 길이 : %zu\n", strlen(str)); // Length는 n - 1 규칙 미적용
return 0;
}
Abc Def Fed Cba
문자열 길이 : 17
코드 설명
<string.h>
헤더 파일을 포함하여strlen()
함수를 사용할 수 있게 합니다.- 문자열 리터럴을 상수 포인터
const char *str
에 할당합니다. puts(str)
을 사용하여 문자열을 출력합니다.strlen(str)
함수를 사용하여 문자열의 길이를 계산하고,%zu
서식 지정자를 사용하여 결과를 출력합니다.
결론
이 글에서는 C 언어에서 strlen()
함수를 사용하여 문자열의 길이를 계산하는 방법을 살펴보았습니다. strlen()
함수는 <string.h>
헤더 파일에 포함되어 있으며, 문자열 길이를 쉽게 계산할 수 있는 유용한 도구입니다.
_strlwr_s() 함수로 문자열을 소문자로 변경하기
strlwr()
함수의 최신 버전인 _strlwr_s()
함수를 사용하면 문자열의 내용을 모두 소문자로 변경할 수 있습니다.
strlwr
는 string lower에서 유래되었습니다.
코드: StrLwr.c
//[?] _strlwr_s() 함수: 문자열을 모두 소문자로 변경
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[20] = "C Language";
printf("%s\n", str); // C Language
_strlwr_s(str, 20); // strlwr(): 비표준 구버전
printf("%s\n", str); // c language
return 0;
}
C Language
c language
strlwr()
함수는 _strlwr()
함수 이름을 거쳐 최신 버전의 컴파일러에서는 _strlwr_s()
함수로 이름이 변경되었습니다.
2번째 매개 변수로 변환시킬 문자열의 길이를 지정하면 됩니다.
숫자 2개를 입력 받아 더 큰 수를 출력하는 프로그램
화면으로부터 문자열을 입력받을 때에는 gets() 함수를 사용할 수 있습니다. 숫자 형태도 실제로 입력될 때에는 문자열 형태로 입력받은 후 이 값을 실제 숫자 값으로 변환 후 사용하면 됩니다. 다음 코드를 작성 후 실행해보세요.
코드: GetString.c
#include <stdio.h>
int main(void)
{
char buffer[80];
int first = 0;
int second = 0;
int max = 0;
printf("첫 번째 수: ");
gets(buffer); // 문자열을 담을 수 있는 그릇에 저장
first = atoi(buffer); // 문자열 형태의 숫자를 실제 정수 형식으로 변환
printf("두 번째 수: ");
gets(buffer);
second = atoi(buffer);
// 조건(3항) 연산자를 사용하여 큰 값 구하기
max = (first > second) ? first : second;
printf("큰 값: %d\n", max);
return 0;
}
첫 번째 수: 3
두 번째 수: 5
큰 값: 5
입력 받은 문자열을 모두 대문자로 변환하기
코드: string_toupper.c
#include <stdio.h>
#include <ctype.h> // toupper()
#include <string.h> // strlen()
int main(void)
{
char buffer[80];
printf("모두 대문자로 변환시킬 문자열 입력: ");
gets(buffer); // hello
printf("원본: %s\n", buffer); // hello
buffer[80 - 1] = 0; // 마지막 문자를 종결 문자로 처리
for (int i = 0; i < (int)strlen(buffer); i++)
{
buffer[i] = toupper(buffer[i]); // 대문자로 문자 변환 후 다시 대입
}
printf("변환: %s\n", buffer); // HELLO
return 0;
}
모두 대문자로 변환시킬 문자열 입력: hello, world!
원본: hello, world!
변환: HELLO, WORLD!
문자열 소문자를 대문자로 변환하기
이번 예제에서는 _strupr
함수를 사용하여 문자열의 소문자를 대문자로 변환하는 방법을 살펴보겠습니다.
코드: string_strupr.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
// 입력 받을 문자열을 저장할 변수 선언
char str[80];
// 사용자에게 문자열을 입력 받음
printf("문자열을 입력하세요: ");
scanf("%s", str);
_strupr(str); // _strupr 함수를 사용하여 문자열의 소문자를 대문자로 변환
// 대문자로 변환된 문자열 출력
printf("대문자로 변환된 문자열: %s\n", str);
return 0;
}
문자열을 입력하세요: abcd
대문자로 변환된 문자열: ABCD
이 코드는 사용자로부터 입력 받은 문자열의 소문자를 _strupr
함수를 이용하여 대문자로 변환한 후 출력합니다. 다만, _strupr
함수는 표준 C 라이브러리에는 포함되어 있지 않고 Visual Studio 환경에서만 사용할 수 있습니다.
fgets() 함수로 문자열 입력 받기
fgets() 함수를 사용하면 gets() 함수와 마찬가지로 사용자로부터 문자열을 입력 받을 수 있습니다.
코드: fgets_string.c
#include <stdio.h>
int main(void)
{
char buffer[80];
printf("문장을 입력하세요: ");
fgets(buffer, 80, stdin);
puts("입력하신 문자열은: ");
puts(buffer);
return 0;
}
문장을 입력하세요: 안녕하세요. 반갑습니다.
입력하신 문자열은:
안녕하세요. 반갑습니다.
문자열을 숫자로 변환하기
문자열을 숫자로 변환하기
숫자가 포함된 문자열을 숫자 형식으로 변환이 가능합니다. stdlib.h 헤더 파일에 선언된 다음 함수들을 사용해서 문자열을 숫자로 변환할 수 있습니다. 함수 이름은 ASCII to integer, long, floating-point의 약자입니다.
atoi(문자열)
: 문자열을int
형식으로 변환atol(문자열)
: 문자열을long
형식으로 변환atof(문자열)
: 문자열을 실수(float
,double
) 형식으로 변환
코드: ascii_to_number.c
//[?] 문자열을 숫자로 변환하기
#include <stdio.h>
#include <stdlib.h> // atoi(), atol(), atof() 함수가 선언된 헤더 파일
int main(void)
{
char* str = "3.141592육오35";
int i = atoi(str); // 문자열을 int 형식으로 변환
long l = atol(str); // 문자열을 long 형식으로 변환
float f = atof(str); // 문자열을 float, double 형식으로 변환
printf("%d\n", i); // 3
printf("%ld\n", l); // 3
printf("%.7lf\n", f); // 3.1415920
return 0;
}
3
3
3.1415920
문자열을 숫자로 변환하는 함수들은 시작 값부터 숫자 형태의 데이터만 지정한 형식으로 변환해 줍니다. 만약 변환할 수 없으면 0
을 반환해줍니다. 숫자 이외의 문자부터는 변환하지 않습니다.
퀴즈: 다음 중 문자열을 숫자 형식으로 변환하는 함수가 아닌 것은?
a. atoi
b. atof
c. atol
d. atod
정답: d
문자열을 숫자 형식으로 변환하는 함수는 atoi()
, atol()
, atof()
가 있습니다.
형식 변환 관련 함수: atoi(), atof(), ltoa()
코드: 함수_내장함수_데모_형식변환관련함수.c
// 함수_내장함수_데모_형식변환관련함수.c
// - 문자열을 숫자형식으로 변환
// - 숫자형을 문자열로 변환
#define _CRT_SECURE_NO_WARNINGS // scanf() 보안 경고에 따른 컴파일 에러 방지
#include <stdio.h>
#include <stdlib.h> // atoi(), ...
int main(void)
{
char str[] = "3.1415구이65\0사오";
long value = 123456;
char buffer[100]; // 문자열을 저장하는 그릇
int i;
long l;
double d;
// 형식 변환 함수를 사용해서 문자열 => 정수/실수
i = atoi(str); // ASCII to Integer : 정수형(int)
l = atol(str); // 정수형(long)
d = atof(str); // 실수형(float, double)
// 형식 변환 : 숫자 => 문자열
_ltoa(value, buffer, 10); // ltoa(123456, 어디에, 10진수로)
// 문자열 출력
printf("%s\n", str);
// 변환된 값 출력
printf("%d\n", i);
printf("%ld\n", l);
printf("%.10f\n", d);
printf("%ld => %s\n", value, buffer);
return 0;
}
3.1415구이65
3
3
3.1415000000
123456 => 123456
문자열을 숫자로 변환하기
C 언어 atoi() 함수를 사용하여 숫자 모양의 문자열을 정수로 변환
C 언어의 atoi() 함수를 사용하여 숫자 모양의 문자열을 정수로 변환하는 예제를 살펴봅니다. atoi() 함수는 <stdlib.h>
헤더 파일에 정의가 되어 있습니다.
코드: atoi_function.c
// atoi() 함수를 사용하여 숫자 모양의 문자열을 정수로 변환
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int result = 0;
int first = 0;
int second = 0;
first = atoi("1234abc"); // 1234
second = atoi("1234\t"); // 1234
result = first + second; // 2468
printf("%d\n", result); // 2468
return 0;
}
2468
"1234"와 같이 큰 따옴표로 묶인 숫자 모양의 문자열은 그 자체가 문자열이지 숫자 형식이 아닙니다. 그래서 더하기 빼기와 같은 연산에서 사용할 때에는 반드시 atoi() 함수를 사용하여 숫자 데이터 타입으로 변경을 해야 합니다.
다음 샘플 코드 형태로 문자열을 숫자로 변환 후 더하기를 해줄 수 있습니다.
> atoi("1234") + atoi("1234")
2468
심지어는 atoi("1234abc") 형태로 값을 주어도 abc는 무시하고 변환할 수 있는 숫자만을 반환시켜 1234만 반환합니다.
> atoi("1234abc")
1234
마찬가지로 atoi("1234\t") 형태로 이스케이스 시퀀스가 포함되어도 무시하고 변환할 수 있는 숫자만 변환시켜 반환해주는 기능을 atoi() 함수가 제공합니다.
> atoi("1234\t")
1234
C 언어 atof() 함수를 사용하여 숫자 모양의 문자열을 실수로 변환
C 언어의 atof() 함수를 사용하여 숫자 모양의 문자열을 실수로 변환하는 예제를 살펴봅니다. atof() 함수는 <stdlib.h>
헤더 파일에 정의가 되어 있습니다.
코드: atof_function.c
// atof() 함수를 사용하여 숫자 모양의 문자열을 실수로 변환
#include <stdio.h>
#include <stdlib.h> // atof()
int main(void)
{
double pi = 0;
pi = atof("3.14");
printf("%g\n", pi); // 3.14
printf("%g\n", atof("3.14abcd")); // 3.14
printf("%g\n", atof("3.14E10")); // 3.14e+10
return 0;
}
3.14
3.14
3.14e+10
"3.14"와 같이 큰 따옴표로 묶인 실수 모양의 문자열은 그 자체가 문자열이지 숫자 형식이 아닙니다. atof() 함수를 사용하면 double 데이터 타입으로 변경할 수 있습니다. atof("3.14abcd") 형태로 값을 주어도 abcd는 무시하고 변환할 수 있는 숫자만을 반환시켜 3.14만 반환합니다.
> atof("3.14abcd")
3.14
다만 주의해야할 것은 atof("3.14E10") 형태의 문자열은 지수 표기법으로 변환이 됩니다.
> atof("3.14E10")
3.14e+10
strcmp 함수로 문자열 비교하기
string.h
파일에 선언되어 있는 strcmp()
함수를 사용하면 두 개의 문자열을 비교할 수 있습니다. strcmp
함수 이름은 문자열 비교를 나타내는 string compare에서 유래되었습니다.
strcmp()
함수의 시그니처는 다음과 같습니다.
int strcmp(const char *_Str1, const char *_Str2);
다음과 같이 strcmp()
를 사용하여 문자열1과 문자열2를 비교할 수 있습니다.
strcmp(문자열1, 문자열2)
strcmp()
함수의 반환값은 정수 타입으로 -1
, 0
, 1
입니다. 반환값의 의미는 다음과 같습니다.
- -1: 첫 번째 문자열이 작을 때
- 0: 두 문자열이 같을 때
- 1: 첫 번째 문자열이 클 때
예제: 문자열 비교하기
다음 코드를 작성하여 strcmp()
함수의 사용법을 익혀보세요.
이 예제에서는 strcmp() 함수를 사용하여 세 가지 다른 문자열 비교 케이스를 확인합니다.
코드: strcmp.c
#include <stdio.h>
#include <string.h>
int main(void)
{
printf("AAA < BBB: %d\n", strcmp("AAA", "BBB")); // -1
printf("AAA == AAA: %d\n", strcmp("AAA", "AAA")); // 0
printf("ZZZ > AAA: %d\n", strcmp("ZZZ", "AAA")); // 1
return 0;
}
출력 결과
AAA < BBB: -1
AAA == AAA: 0
ZZZ > AAA: 1
첫 번째 비교:
strcmp("AAA", "BBB")
이 경우, 첫 번째 문자열인 "AAA"는 두 번째 문자열인 "BBB"보다 사전순으로 앞에 있습니다. 따라서
strcmp()
함수는-1
을 반환하고 출력문은 "AAA < BBB: -1"을 출력합니다.두 번째 비교:
strcmp("AAA", "AAA")
이 경우, 두 문자열이 완전히 같습니다. 따라서
strcmp()
함수는0
을 반환하고 출력문은 "AAA == AAA: 0"을 출력합니다.세 번째 비교:
strcmp("ZZZ", "AAA")
이 경우, 첫 번째 문자열인 "ZZZ"는 두 번째 문자열인 "AAA"보다 사전순으로 뒤에 있습니다. 따라서
strcmp()
함수는1
을 반환하고 출력문은 "ZZZ > AAA: 1"을 출력합니다.
이 예제를 통해 strcmp()
함수를 사용하여 문자열을 비교하는 방법을 확인할 수 있습니다. 반환값에 따라 문자열의 크기를 판별할 수 있으며, 두 문자열이 같은지 여부를 확인할 수도 있습니다.
C언어의 strcmp 함수를 사용하여 간단한 로그인 예제 작성하기
문자열 비교를 위해 strcmp
함수를 사용하면 코드를 간결하게 작성할 수 있습니다.
먼저, strcmp
함수에 대해 알아보겠습니다. strcmp
함수는 문자열을 비교하는 데 사용되는 C 표준 라이브러리 함수입니다. strcmp
는 두 문자열이 동일한지 여부를 확인하기 위해 사용되며, 두 문자열이 동일한 경우 0
을 반환합니다.
이제 간단한 로그인 예제를 작성해보겠습니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char correct_id[] = "user1234";
char correct_password[] = "password1234";
char input_id[50];
char input_password[50];
printf("아이디를 입력하세요: ");
scanf("%s", input_id);
printf("암호를 입력하세요: ");
scanf("%s", input_password);
if (strcmp(input_id, correct_id) == 0 && strcmp(input_password, correct_password) == 0)
{
printf("로그인 성공!\n");
}
else
{
printf("로그인 실패. 아이디 또는 암호가 올바르지 않습니다.\n");
}
return 0;
}
아이디를 입력하세요: user1234
암호를 입력하세요: password1234
로그인 성공!
아이디를 입력하세요: user
암호를 입력하세요: password
로그인 실패. 아이디 또는 암호가 올바르지 않습니다.
이 코드는 사용자로부터 아이디와 암호를 입력받아 정해진 아이디와 암호와 일치하는지 확인합니다. 일치하면 "로그인 성공!"을 출력하고, 그렇지 않으면 "로그인 실패. 아이디 또는 암호가 올바르지 않습니다."를 출력합니다.
strcmp
함수를 사용하면 문자열 비교를 쉽게 처리할 수 있으며, 이를 통해 간단한 로그인 시스템을 구현할 수 있습니다.
fgets() 함수로 문자열 입력받기
코드: FgetsDemo.c
#include <stdio.h>
int main(void)
{
//[1] 문자열 저장 배열
char s[80];
//[2] 문자열 입력
fgets(s, 80, stdin);
//[3] 문자열 출력
puts(s);
return 0;
}
C Language
C Language
sprintf 함수로 서식을 사용한 문자열 만들기
stdio.h
헤더 파일에 선언되어 있는 sprintf
함수를 사용하면 문자 배열에 문자열을 서식을 사용하여 저장할 수 있습니다.
sprintf
함수의 시그니처는 다음과 같습니다.
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
- sprintf(배열명, 서식, 값들...);
- 지정한 배열에 서식에 맞는 문자열 저장 시도 후 성공하면 기록된 문자 수를 반환하거나 오류가 발생하면 -1을 반환합니다.
좀 더 자세한 정보는 Microsoft Learn의 다음 링크를 참고하세요.
숫자 또는 문자열 등을 서식 지정자로 사용하여 묶어서 문자열로 문자 배열에 입력하는 내용은 다음과 같습니다.
코드: sprintf_demo.c
#define _CRT_SECURE_NO_WARNINGS // 보안 경고 무시
#include <stdio.h> // sprintf 함수 선언
int main(void)
{
char buffer[80]; // 문자열 저장 공간 준비
// 서식 지정자를 사용하여 숫자와 문자열을 묶어서 문자 배열에 저장
sprintf(buffer, "%d. Hello, %s!", 1, "World");
printf("%s\n", buffer); // 1. Hello, World!
return 0;
}
1. Hello, World!
sprintf
함수의 두 번째 매개 변수에 printf
와 같은 함수에서 사용하던 서식을 지정하여 하나 이상의 값을 입력 받을 수 있습니다.
%d
로 숫자 1
을 입력 받고 %s
로 "World"
문자열을 입력 받아서 최종적으로 "1. Hello, World!"
문자열을 생성하여 buffer
배열에 저장하고 printf
로 전체 문자열을 출력하였습니다.
NOTE
버퍼(Buffer)
일반적으로, 문자열을 저장할 공간 이름을 버퍼(Buffer)라고 합니다. 그래서 문자 배열 또는 문자열 포인터의 이름에는 s
, str
등과 더불어 buffer
를 많이 사용합니다.
NOTE
80자 코딩
문자열이 들어올 공간의 기본 크기를 일반적으로 80으로 지정합니다. 물론, 반드시 그렇게 할 필요는 없습니다. 지금도 그렇고 아주 오래전에도 그렇고 A4 용지 한 줄에 들어갈 가장 일반적인 문자의 개수는 80자 정도가 적당합니다. 그래서 80자 코딩 개념으로 프로그램 소스 코드도 한 줄에 80자 이상을 넘지 않음을 많이 강조하던 때도 있었습니다. 현재에는 모니터도 엄청 커졌기에 이러한 제한을 두지는 않습니다. 어쨌든 문자열을 담을 그릇인 버퍼의 크기는 이런 이유로 80으로 많이 선언합니다.
서식 지정자 자리에는 문자, 정수, 실수, 문자열 리터럴 등을 모두 사용할 수 있습니다.
다음 코드는 문자, 정수, 실수를 서식으로 입력 받아 출력하는 예제입니다.
코드: sprintf_format.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // sprintf 함수 선언
int main(void)
{
char buffer[80]; // 문자열 저장 공간 준비
// 서식 지정자를 사용하여 여러 종류의 데이터 타입을 묶어서 문자 배열에 저장
sprintf(buffer, "%c, %d, %.2f, %e", 'A', 1234, 3.14, 123.45e-2f);
printf("%s\n", buffer); // A, 1234, 3.14, 1.234500e+00
return 0;
}
A, 1234, 3.14, 1.234500e+00
%c
, %d
, %.2f
, %e
의 4가지 서식을 사용하여 문자, 정수, 실수, 지수 표기법 실수를 입력 받아 문자 배열에 저장 후 출력하였습니다.
기타, 다른 서식 지정자도 사용해보세요.
먄약, 실수 데이터 타입을 %.2f 대신에 %f로 지정하면 소수점 아래 6자리까지 표현됩니다.
sprintf(buffer, "%c, %d, %f", 'A', 1234, 3.14);
A, 1234, 3.140000
문자열 포인터에 서식있는 문자열 저장하기
sprintf
함수를 사용하면 문자열 포인터에도 서식있는 문자열을 저장할 수 있습니다.
동적 메모리 할당을 사용하여 문자열 포인터를 만들고 sprintf 함수로 문자열 저장 후 사용하는 예제는 다음과 같습니다.
코드: sprintf_pointer.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // sprintf 함수 선언
#include <stdlib.h> // malloc, free 함수 선언
int main(void)
{
char* buffer = malloc(sizeof(char) * 80); // 동적 메모리 할당으로 80자 생성
sprintf(buffer, "%c, %d, %f", 'A', 1234, 3.14);
printf("%s\n", buffer); // A, 1234, 3.140000
free(buffer); // 동적 메모리 해제
return 0;
}
A, 1234, 3.140000
다음 코드로 80자를 저장할 수 있는 문자열 포인터를 생성합니다.
char* buffer = malloc(sizeof(char) * 80);
문자 배열과 마찬가지로 문자열 포인터를 sprintf
함수의 첫 번째 매개 변수로 지정하여 사용하면됩니다.
이번 코드에서 주의할 점은 malloc
함수로 동적으로 메모리를 할당했을 때에는 반드시 사용 후 free
함수로 할당된 메모를 해제해야 합니다.
strchr
, strrchr
함수로 문자열에서 문자 찾기
C 언어 strchr, strrchr 함수 요약 노트
strchr
함수: 문자열에서 특정 문자를 찾아 그 위치를 반환하는 함수strrchr
함수: 문자열에서 특정 문자를 역순으로 찾아 그 위치를 반환하는 함수- 함수 원형
char* strchr(const char* str, int c);
char* strrchr(const char* str, int c);
str
: 검색 대상이 되는 문자열c
: 검색하고자 하는 문자- 반환값:
str
내에서c
의 첫 번째/마지막 출현 위치를 가리키는 포인터. 검색 실패 시NULL
반환.
- 예제 코드:
str
문자열에서 'a' 문자를 검색한 후, 첫 번째/마지막 출현 위치부터 끝까지의 문자열을 출력하는 예제.
코드: strchr_strrchr_note.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "C Language";
char* ptr = strchr(str, 'a'); // str 문자열에서 'a' 문자 검색
printf("%s\n", ptr); // ange
ptr = strrchr(str, 'a'); // str 문자열에서 'a' 문자 역순 검색
printf("%s\n", ptr); // age
return 0;
}
strchr
,strrchr
함수 활용 예시 : 문자열에서 특정 문자 찾기, 문자열 분리, 문자열 삭제 등
strchr
함수로 문자열에서 문자 찾기
string.h
헤더 파일에 선언되어 있는 "문자열에서 문자 검색(String Character)"을 의미하는 strchr
함수를 사용하면 문자열에서 특정 문자를 검색할 수 있습니다. 문자 검색은 대소문자를 구분합니다.
strchr
함수의 시그니처는 다음과 같습니다.
char *strchr(
const char *str, // 문자열 포인터
int c // 찾을 문자
);
strchr(문자열배열명, 찾을문자);
- 지정한 문자열 배열에서 특정 문자가 앞에서부터 처음 나오는 포인터를 반환하거나, 찾을 문자가 없으면
NULL
을 반환합니다. - 찾을 문자는 대소문자를 구분합니다.
- 지정한 문자열 배열에서 특정 문자가 앞에서부터 처음 나오는 포인터를 반환하거나, 찾을 문자가 없으면
strchr
함수 사용 예제를 살펴보겠습니다.
코드: strchr_demo.c
// strchr 함수로 문자열에서 문자 찾기
#include <string.h> // strchr()
#include <stdio.h>
int main(void)
{
char string[] = "C language"; // 원본 문자열
int ch = 'a'; // 찾을 문자
char* pfind; // 찾은 문자열 담을 그릇
int position = 0; // 찾은 문자의 위치
// 정방향 검색
pfind = strchr(string, ch);
if (pfind != NULL) // 찾지 못하면 NULL 반환
{
printf("%s\n", pfind); // anguage
position = (int)(pfind - string + 1); // 앞에서부터 찾은 문자의 위치 계산
printf("%d\n", position); // 4
}
return 0;
}
anguage
4
"C language"
문자열에서 'a'
는 "C la..."
처럼 앞에서부터 4
번째 위치에서 찾을 수 있습니다. 그래서 4
번째 이후로의 문자열을 모두 pfind
포인터에 담아 출력하면 "anguage"
가 출력되고 위치 번호는 4
가 출력됩니다.
만약, 찾을 문자를 "C language"
에 없는 'z'
문자를 넣으면 실행 결과 아무것도 출력되지 않습니다.
int ch = 'z'; // 찾을 문자
찾은 문자의 위치는 처음 문자열의 시작에서 찾은 위치까지의 거리를 빼기로 구하면 되는데요. 인덱스가 아닌 위치 번호를 구해야하기에 1
을 더한 값으로 계산합니다.
position = (int)(pfind - string + 1);
strrchr
함수로 문자열에서 역방향으로 문자 검색하기
strchr
함수와 동일한 사용법으로 뒤에서부터 첫 번째로 나오는 문자를 찾는 strrchr
함수도 있습니다.
코드: strrchr_demo.c
// strrchr 함수로 문자열 뒤에서부터 문자 찾기
#include <string.h> // strrchr()
#include <stdio.h>
int main(void)
{
char string[] = "C language"; // 원본 문자열
int ch = 'a'; // 찾을 문자
char* pfind; // 찾은 문자열 담을 그릇
int position = 0; // 찾은 문자의 위치
// 역방향 검색
pfind = strrchr(string, ch);
if (pfind != NULL) // 찾지 못하면 NULL 반환
{
printf("%s\n", pfind); // age
position = (int)(pfind - string + 1); // 뒤에서부터 찾은 문자의 위치 계산
printf("%d\n", position); // 8
}
return 0;
}
age
8
"C language"
에서 오른쪽에서부터 찾다보면 "......age"
위치에 있는 "age"
가 검색이 됩니다. 다만, 위치 번호는 뒤에서부터 세 번째인 3
이 아닌 앞에서부터 계산되어 8
이 됩니다.
퀴즈
strchr
함수는 어떤 함수인가요?strrchr
함수는 무엇을 검색하는 함수인가요?strchr
함수와strrchr
함수는 어떤 차이점이 있나요?strchr
함수와strrchr
함수가 실패할 경우 각각 어떤 값을 반환하나요?- 다음 코드의 실행 결과는 무엇인가요?
코드: strchr_strrchr_quiz.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "C Language";
char* ptr1 = strchr(str, 'a');
char* ptr2 = strrchr(str, 'a');
printf("%s\n", ptr1);
printf("%s\n", ptr2);
return 0;
}
정답:
- 특정 문자를 찾아 그 위치를 반환하는 함수입니다.
- 특정 문자를 역순으로 찾아 그 위치를 반환하는 함수입니다.
strchr
함수는 문자열에서 처음 발견된 문자를 찾아 반환하지만,strrchr
함수는 문자열에서 마지막으로 발견된 문자를 찾아 반환합니다.- 실패할 경우, 두 함수 모두
NULL
을 반환합니다. ange
,age
strstr
함수로 문자열에서 문자열 찾기
C 언어 strstr
함수 요약 노트
strstr
함수: 문자열에서 특정 문자열을 찾아 그 위치를 반환하는 함수- 함수 원형:
char* strstr(const char* str1, const char* str2);
str1
: 검색 대상이 되는 문자열str2
: 검색하고자 하는 문자열- 반환값:
str1
내에서str2
의 첫 번째 출현 위치를 가리키는 포인터. 검색 실패 시NULL
반환
- 예제 코드 :
str1
문자열에서str2
문자열을 검색한 후, 검색된 위치부터 끝까지의 문자열을 출력하는 예제
코드: strstr_ppt.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "C Programming";
char str2[] = "Program";
char* ptr = strstr(str1, str2);
if (ptr != NULL)
{
printf("%s\n", ptr); // Program
}
else
{
printf("Not found.\n");
}
return 0;
}
strstr
함수 활용 예시: 문자열 검색, 문자열 대체, 문자열 삭제 등
strstr
함수로 문자열에서 문자열 찾기
string.h
헤더 파일에 선언되어 있는 문자열 검색(String String)을 의미하는 strstr
함수를 사용하면 문자열에서 특정 문자열을 검색할 수 있습니다. 문자열 검색도 대소문자를 구분합니다.
strstr
함수의 시그니처는 다음과 같습니다.
char *strstr(
const char *str,
const char *strSearch
);
strstr(문자열배열명, 찾을문자열);
- 지정한 문자열 배열에서 특정 문자열이 앞에서부터 처음 나오는 포인터를 반환하거나, 찾을 문자열이 없으면
NULL
을 반환합니다.
- 지정한 문자열 배열에서 특정 문자열이 앞에서부터 처음 나오는 포인터를 반환하거나, 찾을 문자열이 없으면
strstr
함수의 사용 예제를 살펴보겠습니다.
코드: strstr.c
//[?] strstr 함수로 문자열 검색하기
#include <stdio.h>
#include <string.h> // 문자열 관련 함수를 사용하기 위한 헤더 파일 포함
int main(void)
{
// 문자열 "C Coding!!!"을 포함하는 char 배열 buffer 선언 및 초기화
char buffer[] = "C Coding!!!";
// buffer에서 "ing"이라는 문자열을 검색하고, 검색된 위치를 가리키는 포인터 pfind에 저장
char* pfind = strstr(buffer, "ing");
// pfind가 가리키는 위치부터 문자열을 출력
printf("%s\n", pfind); // ing!!!
return 0;
}
ing!!!
strstr
함수는 첫 번째 인자로 전달된 문자열에서 두 번째 인자로 전달된 문자열을 검색하고, 검색된 위치를 가리키는 포인터를 반환합니다. 검색에 실패하면 NULL
을 반환합니다.
"C Coding!!!" 문자열을 담고있는 buffer
에서 strstr
함수로 "ing"를 검색하면 해당 문자열이 검색이되므로 해당 문자열의 시작 포인터를 반환해서 pfind
포인터 변수에 담습니다. 그리고 %s
서식 지정자로 출력해보면 "ing!!!" 형태로 포인터 시작 위치 이후로의 모든 문자열을 가지고 옵니다.
문자열 검색할 때 해당 문자열의 시작 위치를 구할 수 있습니다. 다음 예제를 살펴보세요.
코드: strstr_demo.c
// strstr 함수로 문자열에서 문자열 찾기
#include <string.h>
#include <stdio.h>
int main(void)
{
char string[] = "C language"; // 원본 문자열
char* pfind; // 찾은 문자열 담을 그릇
int position = 0; // 찾은 문자열의 시작 위치
// 문자열 검색
pfind = strstr(string, "age"); // "age" 문자열 찾기
if (pfind != NULL) // 찾지 못하면 NULL 반환
{
printf("%s\n", pfind); // age
position = (int)(pfind - string + 1); // 앞에서부터 찾은 문자열의 시작 위치
printf("%d\n", position); // 8
}
return 0;
}
age
8
"C Language"
에서 "age"
를 검색하면 ".......age"
에서 검색이 됩니다. 그래서 결괏값으로 "age"
가 pfind
변수에 담기고 시작 위치 값은 앞에서부터 계산되어 8
이 됩니다.
오픈코딩 동영상 강의 - strstr
함수로 문자열에서 문자열 찾기
퀴즈
strstr
함수의 반환형은 무엇인가요?- 다음 코드의 실행 결과는 무엇인가요?
코드: strstr_quiz.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "C Language";
char* ptr = strstr(str, "lang");
printf("%s", ptr);
return 0;
}
strstr
함수는 대소문자를 구분할까요?
정답:
char*
Language
- 대소문자를 구분합니다.
strtok
함수로 문자열에서 문자열 분리하기
strtok
함수로 문자열에서 문자열 분리하기 요약 노트
- C 언어의 문자열 처리 함수 중 하나
- 문자열을 특정 구분자(delimiter)를 기준으로 분리하여 토큰(token)으로 반환
- 사용 방법:
char *strtok(char *str, const char *delim);
strtok
함수 사용 방법
strtok
함수는 문자열 포인터와 구분자 문자열을 인자로 받음- 최초 호출 시에는 분리할 문자열을 인자로 전달하고, 이후에는 NULL을 전달하여 호출
char *strtok(char *str, const char *delim);
- 반환값은 다음 토큰(token)을 가리키는 포인터
- 마지막 토큰을 반환한 이후에는 NULL을 반환
strtok
함수 사용 예시
- 문자열 str은 ,로 분리되는 세 개의 단어가 포함된 문자열
strtok(str, ",")
호출 시 첫 번째 토큰인apple
을 반환하고, 이후에는,
를 구분자로 다음 토큰을 반환while
루프를 통해 모든 토큰을 순서대로 출력
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana,grape";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}
- 문자열 str은 ,로 분리되는 세 개의 단어가 포함된 문자열
- strtok(str, ",") 호출 시 첫 번째 토큰인 apple을 반환하고, 이후에는 ,를 구분자로 다음 토큰을 반환
- while 루프를 통해 모든 토큰을 순서대로 출력
strtok
함수 주의사항
- 원본 문자열이 변경됨
strtok
함수는 스레드에 안전하지 않음- 여러 문자열을 동시에 분리하기 위해서는
strtok_r
함수를 사용해야 함
요약
C 언어의 strtok
함수는 문자열에서 특정 구분자를 기준으로 문자열을 분리할 때 유용함
strtok
함수를 사용하면 쉽게 문자열을 분리하고 각각의 토큰(token)을 얻을
strtok
함수로 문자열에서 문자열 분리하기
strtok
함수는 문자열을 구분자(delimiter)를 기준으로 분리합니다. 문자열 내의 특정 구분자를 기준으로 문자열을 분리하여 여러 개의 문자열을 만들 수 있습니다.
strtok
함수는 문자열을 순차적으로 검색하여 구분자가 나타나는 위치를 찾습니다. 그리고 해당 위치를 기준으로 이전까지의 문자열을 반환하며, 이후에는 다음 검색 시작 위치를 저장합니다. 이를 통해 다음에 strtok
함수를 호출하면 이전에 검색한 위치에서부터 다시 검색을 시작할 수 있습니다.
strtok 함수 시그니처는 다음과 같습니다.
char* strtok(char* str, const char* delim);
- str: 분리할 원본 문자열입니다.
- delim: 분리할 기준이 되는 구분자입니다.
위 함수를 호출하면 str
문자열에서 delim
문자열이 나타나는 위치를 검색합니다. 첫 번째 호출시 str
을 인자로 전달하며, 이후에 호출될 때는 NULL
을 인자로 전달합니다. 검색된 구분자 문자열 앞쪽의 문자열을 반환하며, 이후에는 다음 검색 시작 위치를 내부적으로 저장합니다. 더 이상 검색할 문자열이 없을 경우 NULL
을 반환합니다.
예를 들어, csv
라는 문자열에서 쉼표(,)를 구분자로 사용하여 문자열을 분리하려면 다음과 같이 코드를 작성할 수 있습니다.
char csv[] = "red,green,blue";
char seps[] = ",";
char* token = NULL;
token = strtok(csv, seps);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, seps);
}
위 코드를 실행하면 다음과 같이 출력됩니다.
red
green
blue
strtok
함수로 단계별로 하나씩 출력하는 코드를 만들면 다음과 같습니다.
코드: strtok_demo.c
// `strtok` 함수로 문자열에서 구분자로 문자열 분리하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char csv[] = "red,green,blue"; // 분리할 문자열
char seps[] = ","; // 구분자 문자열
char* token = NULL; // 검색된 토큰을 저장할 포인터 변수
char* next_token = NULL; // 다음 검색 시작 위치를 저장할 포인터 변수
token = strtok(csv, seps, &next_token); // 첫 번째 토큰 검색
if (token != NULL) // 토큰이 NULL이 아닌 경우
{
printf("%s\n", token); // 첫 번째 토큰 출력 ("red")
token = strtok(NULL, seps, &next_token); // 두 번째 토큰 검색
if (token != NULL) // 토큰이 NULL이 아닌 경우
{
printf("%s\n", token); // 두 번째 토큰 출력 ("green")
token = strtok(NULL, seps, &next_token); // 세 번째 토큰 검색
if (token != NULL) // 토큰이 NULL이 아닌 경우
{
printf("%s\n", token); // 세 번째 토큰 출력 ("blue")
}
}
}
return 0;
}
red
green
blue
위 코드에서 strtok
함수를 사용하여 문자열 csv
에서 구분자 seps
를 사용하여 첫 번째, 두 번째, 세 번째 토큰을 검색합니다. 검색된 각각의 토큰은 printf
함수를 사용하여 출력됩니다.
동영상 강의
퀴즈
- 다음 중 문자열의 길이를 반환해주는 함수는 무엇인가요?
a. strlen
b. strcmp
c. strcpy
d. strcat
정답: a
해설: 문자열의 길이는 문자열의 길이(String Length)를 의미하는 strlen
함수를 사용하여 구할 수 있습니다.
- 다음 코드를 완성하여
buffer
에"1. Hello"
가 저장되도록 코드를 작성하세요.
sprintf(buffer, "%d. %s", 1, "Hello");
정답: "%d. %s"
해설: 다음과 같이 서식을 지정하면 "1. Hello"
문자열이 buffer
에 담깁니다.
sprintf(buffer, "%d. %s", 1, "Hello");
- 다음 코드의 실행 결과로 알맞는 것은?
sprintf(buffer, "%c, %d, %f", 'A', 1234, 3.14);
printf("%s\n", buffer);
a. a, 1234, 3.14 b. A, 1234, 3.140000 c. a, 1,234, 3.14 d. A, 1,234, 3.140000
정답: b
해설: sprintf
함수의 서식 지정자로 %f
를 지정하면 실수 데이터를 소수점 이하 6
자리까지 표현합니다.
- 다음 중 문자를 검색하는 함수를 모두 고르세요.
a. strstr
b. strchr
c. strrchr
d. strcpy
정답: b, c
해설: 문자를 검색하는 정방향 검색은 strchr
함수를 사용하고 역방향 검색은 strrchr
함수를 사용합니다.
strstr
함수는 문자열을 검색하는 함수이고, strcpy
함수는 문자열을 복사하는 함수입니다.
문제 풀이
정보처리기능사 실기 문제: 문자열 길이 계산 함수 구현
이 문제에서는 C 언어를 사용하여 문자열의 길이를 계산하는 함수 len
을 구현하고, 이 함수를 사용하여 두 문자열의 길이 합을 출력하는 프로그램을 작성하는 것이 목표입니다. 문자열은 포인터를 통해 처리되며, 함수는 주어진 문자열의 길이를 계산하여 반환합니다.
#include <stdio.h>
int len(char* p);
int main(void)
{
char* p1 = "2022";
char* p2 = "202207";
int a = len(p1);
int b = len(p2);
printf("%d", a + b);
}
int len(char* p)
{
int r = 0;
while (*p != '\0')
{
p++;
r++;
}
return r;
}
해결 방법:
#include <stdio.h>
를 사용하여 표준 입출력 라이브러리를 포함합니다.len
함수를 정의하여 문자열의 길이를 계산합니다. 이 함수는 포인터p
를 매개변수로 받으며, 포인터가 가리키는 문자열을 순회하면서 널 문자('\0'
)가 나올 때까지 카운트를 증가시킵니다.main
함수에서 문자열 포인터p1
과p2
를 선언하고 각각 "2022"와 "202207"로 초기화합니다. 각 문자열에 대해len
함수를 호출하여 그 길이를 계산합니다.- 계산된 두 문자열의 길이를 더한 값을
printf
함수를 사용하여 출력합니다.
이 문제는 문자열 처리의 기본적인 개념과 포인터를 활용한 문자열의 길이 계산 방법을 이해하는 데 중점을 둡니다. 문자열의 길이를 계산하는 함수를 직접 구현함으로써, C 언어에서의 문자열 처리와 포인터 사용법에 대한 이해도를 평가합니다.
정보처리기사 실기 기출 변형 문제: 문자열 길이 계산
파일명: str_len_calc.c
문제 설명: 아래 제공된 C 프로그램은 두 문자열의 길이를 계산하여 그 합을 출력합니다. 코드를 분석하고, 최종 출력 결과를 예측해 보세요.
#include <stdio.h>
int length(const char* str);
int main()
{
const char* str1 = "DevLec";
const char* str2 = "VisualAcademy";
printf("%d", length(str1) + length(str2));
return 0;
}
int length(const char* str)
{
int len = 0;
while(*str++ != '\0')
{
len++;
}
return len;
}
해결 방법:
str1
과str2
는 각각"DevLec"
와"VisualAcademy"
문자열을 가리키는 상수 문자열 포인터로 초기화됩니다. 이는 문자열을 안전하게 처리하도록 돕는 상수 포인터 사용법을 따릅니다.length
함수는 주어진 문자열의 길이를 계산하여 반환합니다. 이 함수는 널 문자('\0'
)를 만날 때까지 문자열을 순회하며 길이를 증가시키고, 순회가 끝나면 길이를 반환합니다.printf
함수는 계산된 두 문자열의 길이 합을 출력합니다.
출력 결과 예측: 이 문제는 문자열 길이를 계산하는 기본적인 프로그래밍 능력과 문자열의 길이 합을 출력하는 과정을 통해 프로그래밍 이해도를 평가합니다. 문자열 "DevLec"
와 "VisualAcademy"
의 길이를 각각 계산한 후, 그 합을 출력함으로써 문자열 처리 기술을 점검합니다.