2024.04.09. C언어 - strcpy, strlen, strcmp
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 20;
char c[10] = "apple";
char d[10] = "pie";
printf("%d\n", a + b);
printf("%s\n", c + d);
return 0;
}
실패하게 됨.
더하기 연산자로 문자열을 더할수는 없음. 그러므로 문자열로 연산할 때는 문자열 연산에 사용하는 함수를 따로 사용해야함.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[80], str2[80];
char *resp;
printf("2개의 과일 이름 입력 : ");
scanf("%s%s", str1, str2);
if (strlen(str1) > strlen(str2))
resp = str1;
else
resp = str2;
printf("이름이 긴 과일은 %s\n", resp);
return 0;
}
문자열의 길이를 계산하는 함수 strlen()
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[80] = "pear";
char str2[80] = "peach";
printf("사전에 나중에 나오는 과일 이름 : ");
if (strcmp(str1, str2) > 0)
printf("%s\n", str1);
else
printf("%s\n", str2);
return 0;
}
strcmp 함수 : 두 문자열의 사전 순서를 파악하여 그 결과를 반환하는 함수.
* 사전 순서란? 사전에 단어가 수록되는 알파벳 순서를 뜻함
strncmp 함수 : string + number + cmp. 문자 수를 몇 번째 인수로 지정할 건지 설정할 수 있음.
strcmp(str1, str2);
str1이 str2보다 사전에 나중에 나오면 1 반환
먼저 나오면 -1 반환
같은 문자열이면 0 반환
#include <stdio.h>
int main(void)
{
int a = 10, b = 20;
printf("교환 전 a와 b의 값 : %d, %d\n", a, b);
{
int temp;
temp = a;
a = b;
b = temp;
}
printf("교환 후 a와 b의 값 : %d, %d\n", a, b);
return 0;
}
변수
지역변수 공부 (auto 지역 변수)
범위가 함수 내, 즉 일정 지역(블록 내)에서만 사용하는 변수. auto 예약어와 함께 함수 안에 지역 변수를 선언함.
장점
1) 메모리를 효율적으로 사용 가능
2) 디버깅에 유리함
temp 변수 : temporary 변수 (임시 변수) 값을 옮기기 전에 임시로 저장하는 변수 역할
전역 변수 : 함수 밖에 선언된 변수
static 지역 변수 (정적 지역 변수) : 정적 지역 변수는 선언된 함수가 반환되더라도 그 저장 공간을 계속 유지함. 하나의 함수가 여러 번 호출되는 경우 같은 변수를 공유하는 것이 가능함. (정적 지역 변수의 저장 공간은 프로그램이 실행되는 동안 계속 유지됨)
static 선언 vs auto 선언 차이점
static을 선언할 때 왜 굳이 굳이 static을 사용하는가에 대한 생각도 필요함.
#include <stdio.h>
void auto_func(void);
void static_func(void);
int main(void)
{
int i;
printf("일반 지역 변수(auto)를 사용한 함수...\n");
for (i = 0; i < 3; i++)
{
auto_func();
}
printf("정적 지역 변수(static)를 사용한 함수...\n");
for (i = 0; i < 3; i++)
{
static_func();
}
return 0;
}
void auto_func(void)
{
auto int a = 0;
a++;
printf("%d\n", a);
}
void static_func(void)
{
static int a;
a++;
printf("%d\n", a);
}
챗지피티4 검색 결과
`static` 함수를 사용하는 이유는 주로 함수의 가시성(visibility)을 제한하기 위해서입니다. `static` 키워드를 사용하여 함수를 선언하면 해당 함수는 정의된 파일 내에서만 접근할 수 있게 됩니다. 이러한 특성 때문에 `static` 함수는 다음과 같은 이유로 유용하게 사용됩니다:
### 1. 캡슐화와 정보 은닉
`static` 함수는 해당 소스 파일 내에서만 사용되도록 제한함으로써, 모듈화와 캡슐화를 촉진합니다. 이는 프로그램의 다른 부분에서 사용될 의도가 아닌 함수를 숨김으로써, 인터페이스와 구현의 분리 원칙을 강화합니다. 이 방식으로, 개발자는 구현 세부 사항을 캡슐화하고, 오직 필요한 인터페이스만을 외부에 노출시킬 수 있습니다.
### 2. 이름 충돌 방지
같은 이름의 `static` 함수가 다른 파일에 있더라도, 각 함수는 오직 자신이 정의된 파일 내에서만 접근 가능합니다. 이는 라이브러리나 대규모 프로젝트에서 유용하게 사용될 수 있습니다. 예를 들어, 여러 개발자가 작업하는 큰 프로젝트에서는 같은 이름의 함수가 여러 개 존재할 수 있는데, `static`을 사용함으로써 이름 충돌을 피할 수 있습니다.
### 3. 메모리 사용 최적화
일부 컴파일러에서는 `static` 함수를 사용함으로써, 함수 호출의 오버헤드를 줄일 수 있는 최적화를 수행할 수 있습니다. 예를 들어, `static` 함수는 인라인 함수로 대체될 가능성이 더 높아, 함수 호출 비용이 줄어들 수 있습니다.
### 4. 구현 세부 사항 숨기기
라이브러리나 API를 제공할 때, `static` 함수를 사용하면 사용자에게 노출되지 않아야 하는 구현 세부 사항을 숨길 수 있습니다. 이로써 API 사용자는 제공된 인터페이스에만 집중할 수 있으며, 라이브러리 개발자는 내부 구현을 자유롭게 변경할 수 있습니다.
### 예제
// file1.c
static void helperFunction() {
// 이 함수는 file1.c에서만 접근 가능
}
void publicFunction() {
helperFunction(); // 같은 파일 내에서 호출 가능
}
// file2.c
void anotherFunction() {
helperFunction(); // 컴파일 에러: 'helperFunction'은 file1.c 내에서만 접근 가능
}
요약하자면, `static` 함수를 사용하는 주된 이유는 함수의 가시성을 파일 내로 제한하여, 프로그램의 다른 부분으로부터 구현 세부사항을 숨기고, 이름 충돌을 방지하며, 코드의 캡슐화와 메모리 사용 최적화를 도모하기 위함입니다.
static을 선언하면 기존 함수 선언을 하면 stack에 저장되어 순서대로 착착착착 빠져나가야 되는데 static을 선언하면 저장되는 영역(점유하는 공간)이 달라지게 됨.
효율적으로 관리하기 위해서 사용하는 쪽이 큼.
그러니까 내가 이해한 바를 정리해보자면 static 선언을 한다는 건 전역 변수처럼 작동하지만 지역 변수라서 메모리는 적게 먹는 그런 녀석임. 그런데 문제점은 도대체 어떤 상황에서 이녀석을 사용할 것인지에 대한 것인데, 조금 더 고민해보자..
이 함수는 외부 프로그램에서는 가져올 수 없음 보안성을 위해 사용하는 것
우리가 라이브러리로 가져오는 건 다른 지역변수나 전역변수들이고 스태틱을 선언하면 가져올 수 없다는 차이점이 있음.