[코딩도장] Unit 41 ~ 45
1. 문자열 길이 구하기 (strlen)
1. strlen
size_t strlen(const *_str)
strlen 함수는 문자열의 길이를 구하는 함수이다
<string.h> 헤더 파일에 선언되어 있다
char *s1 = "Hello"; // 포인터에 문자열 Hello의 주소 저장
char s2[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당
printf("%d\n", strlen(s1)); // 5: strlen 함수로 문자열의 길이를 구함
printf("%d\n", strlen(s2)); // 5: strlen 함수로 문자열의 길이를 구함
strlen 함수가 문자열의 길이를 구할 때는 NULL 부분은 포함하지 않는다
s2 와 같이 배열의 크기와 상관없이 문자열의 길이만 구한다
2. 문자열 비교하기 (strcmp)
1. strcmp
int strcmp(const *_str1, char *const_str2)
strcmp 함수는 두 문자열을 비교하고 결과값을 정수로 반환하는 함수이다
<string.h> 헤더파일에 선언되어 있다
char s1[10] = "Hello";
char *s2 = "Hello";
int ret = strcmp(s1, s2); // 두 문자열이 같은지 문자열 비교
printf("%d\n", ret); // 0: 두 문자열이 같으면 0
strcmp(s1, s2) 와 같이 비교할 문자열을 넣어주면 정수로 반환한다
- -1 : ASCII 코드 기준으로 문자열(s2)가 클 때
- 0 : ASCII 코드 기준으로 문자열이 같을 때
- 1 : ASCII 코드 기준으로 문자열(s1)이 클 때
strcmp 함수는 Windows(Visual Studio) 에서는 문자열이 다르면 1, -1 을 반환한다
리눅스와 OS X 에서는 ASCII 코드값의 차이를 반환한다
3. 문자열 복사하기 (strcpy)
1. strcpy
char *strcpy(char *_Dest, char const *_Source)
strcpy 함수는 문자열을 다른곳으로 복사한다
<string.h> 헤더파일에 선언되어 있다
char s1[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당
char s2[10]; // 크기가 10인 char형 배열을 선언
strcpy(s2, s1); // s1의 문자열을 s2로 복사
printf("%s\n", s2); // Hello
strcpy(s2, s1)와 같이 복사된 결과가 저장될 문자열과 복사할 문자열을 넣는다
복사된 결과가 저장될 배열의 크기는 NULL까지 들어갈 수 있어야 한다
※ 문자열 포인터는 읽기 전용이기 때문에 문자열을 복사할 수 없다
malloc 함수로 메모리를 할당하고 사용하면 복사할 수 있다
4. 문자열 붙이기 (strcat)
1. strcat
char *strcat(char *_Destination, char const *_Source)
strcat 함수는 두 문자열을 붙여서 최종 문자열의 포인터를 반환한다
<string.h> 헤더파일에 선언되어 있다
char s1[10] = "world";
char s2[20] = "Hello"; // s2 뒤에 붙일 것이므로 배열 크기를 크게 만듦
strcat(s2, s1); // s2 뒤에 s1를 붙임
printf("%s\n", s2); // Helloworld
strcar(s2, s1)과 같이 최종 결과가 나올 문자열과 붙일 문자열을 넣는다
이렇게 하면 s2 뒤에 s1 이 붙어서 출력된다
문자열을 붙이더라도 배열이 모자라지 않게 크기를 넉넉하게 만들어야 한다
※ 문자열 포인터는 읽기 전용이기 때문에 문자열을 붙일 수 없다
malloc 함수로 메모리를 할당하고 사용하면 붙일 수 있다
5. 문자열 만들기(sprintf)
1. sprintf
int sprintf(char *const_Buffer, char const *const_Format, ...)
sprintf 함수는 서식을 지정하여 문자열을 출력하는 함수이다
<stdio.h> 헤더파일에 선언되어 있다
문자열의 오른쪽부터 문자를 찾고 싶다면 strrchr 함수를 사용하면 된다
char s1[20]; // 크기가 20인 char형 배열을 선언
sprintf(s1, "Hello, %s", "world!"); // "Hello, %s"로 서식을 지정하여 s1에 저장
printf("%s\n", s1); // Hello, world!: 문자열 s1 출력
sprintf 함수에 문자열을 저장할 배열, 문자열을 만들 서식, 문자열 만들 값을 순서대로 넣는다
Hello, %s 에서 Hello, world! 가 s1 에 저장된다
s1 과 같이 문자열을 저장할 빈 배열을 버퍼(Buffer) 라고 부른다
서식지정자를 사용하기 때문에 C언어의 다른 자료형도 문자열로 만들 수 있다
6. 문자열 찾기 (strchr, strstr)
1. 문자열에서 문자 찾기 (strchr, strrchr)
char *strchr(char *const_String, int const_Ch)
문자열에서 특정 문자를 찾기 위해선 strchr 함수를 사용해야 한다
<string.h> 헤더파일에 선언되어 있다
char s1[30] = "A Garden Diary"; // 크기가 30인 char형 배열을 선언하고 문자열 할당
char *ptr = strchr(s1, 'a'); // 'a'로 시작하는 문자열 검색, 포인터 반환
strchr 함수에 문자열과 검색할 문자를 넣으면
해당 문자로 시작하는 문자열의 위치(포인터)를 반환한다
'a' 로 시작하는 부분을 더 찾기 위해서는 while 반복문을 사용해야 한다
while (ptr != NULL) // 검색된 문자열이 없을 때까지 반복
{
printf("%s\n", ptr); // 검색된 문자열 출력
ptr = strchr(ptr + 1, 'a'); // 포인터에 1을 더하여 a 다음부터 검색
}
검색된 문자열의 포인터를 strchr 함수에 넣어서 반복한다
NULL 이 나오면 문자열이 없기 때문에 반복을 끝낸다
strchr 함수는 대소문자를 구분하기 때문에 검색할 문자를 'a' 로 지정하면 'A'는 건너뛴다
while 로 반복하다가 NULL을 만나면 NULL을 반환한뒤 반복문을 끝낸다
※ 문자열에서 문자를 오른쪽 끝부터 찾고 싶다면 strrchr 함수를 사용하면 된다
2. 문자열에서 문자열 찾기 (strstr)
char *strstr(char * const_String, char const * const_SubString)
문자열에서 문자열을 찾기 위해선 strstr 함수를 사용해야 한다
<string.h> 헤더파일에 선언되어 있다
char s1[30] = "A Garden Diary"; // 크기가 30인 char형 배열을 선언하고 문자열 할당
char *ptr = strstr(s1, "den"); // den으로 시작하는 문자열 검색, 포인터 반환
printf("%s\n", ptr); // den Diary
strstr 함수에 문자열과 검색할 문자열을 넣어주면
해당 문자열로 시작하는 문자열의 위치(포인터)를 반환한다
검색한 문자열만 나오는 것이 아닌 뒤에 오는 모든 문자열이 나온다
strstr 함수도 대소문자를 구분한다
while (ptr != NULL) // 검색된 문자열이 없을 때까지 반복
{
printf("%s\n", ptr); // 검색된 문자열 출력
ptr = strstr(ptr + 1, "den"); // den 포인터에 1을 더하여 e부터 검색
}
또한 while 반복문으로 반복할 수 있다
7. 문자열 자르기 (strtok)
1. strtok
char *strtok(char *_String, char const *_Delimiter)
strtok 함수는 특정 문자를 기준으로 문자열을 자르는 함수이다
<string.h> 헤더파일에 선언되어 있다
char s1[30] = "The Little Prince"; // 크기가 30인 char형 배열을 선언하고 문자열 할당
char *ptr = strtok(s1, " ");
strtok(s1, " ")와 같이 " " 공백문자를 넣어주면 공백으로 구분하여 문자열을 자른다
※ 기준 문자를 ' ' 로 묶으면 안된다
strtok 함수는 잘린 문자열을 한번에 얻을 수 없어서 while 반복문으로 문자열을 자르다가
문자열이 나오지 않으면 반복문을 끝내는 방식으로 사용한다
while (ptr != NULL) // 자른 문자열이 나오지 않을 때까지 반복
{
printf("%s\n", ptr); // 자른 문자열 출력
ptr = strtok(NULL, " "); // 다음 문자열을 잘라서 포인터를 반환
}
ptr = strtok(NULL, " ") 처럼 자를 문자열 부분에 NULL 을 넣어준다
strtok 함수는 처음에만 자를 문자열을 넣어주고
그 다음부터는 NULL을 넣어준다
while 반복문 안의 strtok 에 NULL을 넣어주어 잘린 문자열만큼 다음 문자로 이동한다
그리고 다시 공백문자를 찾아서 NULL 로 채운뒤 "Little" 을 자른다
다시 strtok 에 NULL을 넣어주어 앞에서 잘린 문자열만큼 다음 문자로 이동한다
문자열 마지막의 NULL을 만났기 때문에
NULL을 그대로 두고 "Prince 를 반환한다
문자열의 끝인 NULL을 만났기 때문에 자를 문자열이 없으므로
NULL을 반환하고 while 반복문을 끝낸다
strtok 함수는 문자열을 새로 생성해서 반환하는 것이 아닌
자르는 부분을 NULL로 채운 뒤 잘린 문자열의 포인터를 반환한다
※ 원본 문자열의 내용을 바꾸므로 사용에 주의해야 한다
8. 심사문제
41.6 문자열 길이 구하기
표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 입력된 문자열의 길이를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)
정답에는 C 언어 컴파일러에서 정상적으로 컴파일 되는 전체 코드를 입력해야 합니다.
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[40];
scanf("%s", s1);
printf("%lu", strlen(s1));
return 0;
}
strlen 함수는 size_t 자료형이다
따라서 서식지정자 %lu 를 사용한다
41.7 문자열 비교하기
표준 입력으로 길이 30 이하의 문자열 두 개가 입력됩니다(입력되는 문자열은 공백으로 구분됩니다.) 두 문자열이 같은지 다른지 비교 결과를 정수로 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)
정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체 코드를 입력해야 합니다
주의사항 : 온라인 심사는 리눅스에서 실행됩니다. 따라서 strcmp 함수의 반환값을 반환하는 코드로 작성해야 합니다.
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[40];
char s2[40];
scanf("%s %s", s1, s2);
printf("%d", strcmp(s1, s2));
return 0;
}
42.10 문자 배열 복사하기
표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 다음 소스 코드를 완성하여 두 pritnf 가 같은 문자열을 출력하게 만드세요.
정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char s1[31];
char s2[31];
_______________
_______________
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
정답
scanf("%s", s1);
strcpy(s2, s1);
42.11 두 문자열 붙이기
표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 다음 소스코드를 완성하여 입력된 문자열 뒤에 "th"가 붙어서 출력되게 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)
정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char s1[40];
______________________________________
______________________________________
printf("%s\n", s1);
return 0;
}
정답
scanf("%s", s1);
strcat(s1, "th");
43.6 서수 줄임말 문자열 만들기
표준 입력으로 1과 7사이의 숫자와 길이 30 이하의 문자열이 입력됩니다. 다음 소스 코드를 완성하여 입력된 숫자의 서수 줄임말(1st, 2nd, 3rd, 4th, 5th, 6th, 7th)과 입력된 문자열이 출력되게 만드세요.
정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int number;
char name[31], result[40];
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
printf("%s\n", result);
return 0;
}
정답
scanf("%d %s", &number, name);
switch (number) {
case 1:
sprintf(result, "%dst %s", number, name);
break;
case 2:
sprintf(result, "%dnd %s", number, name);
break;
case 3:
sprintf(result, "%drd %s", number, name);
break;
default:
sprintf(result, "%dth %s", number, name);
break;
}
44.7 공백 개수 세기
표준 입력으로 길이 1,000 이하의 문자열이 입력됩니다. 입력된 문자열에서 공백의 개수를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)
scanf 에서 공백을 포함한 문자열을 입력받으려면 서식지정자로 %[^\n]s 를 사용하면 됩니다
정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다.
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[1001];
scanf("%[^\n]s", s1);
char *ptr = strchr(s1, ' ');
int count = 0;
while (ptr != NULL) {
count += 1;
ptr = strchr(ptr + 1, ' ');
}
printf("%d", count);
return 0;
}
45.7 문자열 자르기
표준 입력으로 길이 60 이하의 인터넷 도메인이 입력됩니다. 점을 기준으로 문자열을 분리하여 각 줄마다 출력하세요.
정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다.
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[61];
scanf("%s", s1);
char *tok = strtok(s1, ".");
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, ".");
}
return 0;
}
45.8 특정 단어 개수 세기
표준 입력으로 길이 1,000 이하의 문자열이 입력됩니다. 입력된 문자열에서 "the"의 개수를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.) 단, 모든 문자가 소문자인 "the"만 찾으면 되며 "them", "there", "their" 등은 포함하지 않아야 합니다
정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
int count = 0;
char s1[1001];
scanf("%[^\n]s", s1);
char *ptr = strtok(s1, " .,");
while (ptr != NULL) {
int ret = strcmp(ptr, "the");
if (ret == 0) {
count += 1;
}
ptr = strtok(NULL, " .,");
}
printf("%d", count);
return 0;
}
strtok 함수로 공백(" "), 점(.), 콤마(,)를 기준으로 문자열을 잘라준다
그 뒤 strcmp 함수로 자른 문자열이 "the" 와 같은지 확인하고
같다면 count 의 값을 1 늘린다
'Coding > C' 카테고리의 다른 글
[C언어] 구조체 멤버 정렬, 구조체 배열 - 코딩도장 (0) | 2024.01.22 |
---|---|
[C언어] 구조체, 구조체 포인터 - 코딩도장 (0) | 2024.01.20 |
[C언어] 문자열 사용하기- 코딩도장 (0) | 2024.01.12 |
[C언어] 배열, 배열 포인터 사용하기 - 코딩도장 (0) | 2024.01.07 |
[C언어] 포인터, 메모리 사용하기 - 코딩도장 (0) | 2023.12.20 |