본문 바로가기
C/기초(두들낙서)

[C기초] 배열과 문자열

by Meaning_ 2022. 1. 2.
728x90
반응형

배열의 정의 및 선언

배열은 변수들이 늘어서 있는 구조로

배열의 선언은 int a[5]; <- 이런식으로 해주는데 a가 배열의 이름이고 [5]가 배열의 크기이다. 

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
    
    for (int i = 0; i < 5; i++) {
        a[i] = i * 5;
    }
    for (int i = 0; i < 5; i++) {
        printf("%d\n", a[i]);
    }
}
cs

간단하게 for문을 통해 배열을 완성해보았다.

배열의 선언 방법은 위의 예시 말고도 int arr[n]={    };의 형태도 있다.

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main() {
    int arr[5= { 3,1,4,1,5 };
 
    for (int i = 0; i < 5; i++) {
        printf("%d\n", arr[i]);
    }
 
 
}
cs

 

여기서 문제점은 배열의 크기가 가변적으로 변한다면 i<5 의 형태는 적합하지 못하다. 이때 쓰는 것이 sizeof() 이다. 

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main() {
    int arr[5= { 3,1,4,1,5 };
 
    for (int i = 0; i <sizeof(arr)/sizeof(int); i++) {
        printf("%d\n", arr[i]);
    }
 
 
}
cs

int는 4바이트이기 때문에 arr의 크기는 4*5 이다. 이걸 4로 나눠주면 배열의 크기인 5가 나온다. 

자바에서는 배열의 길이를 나타내주는게  arr.length인데 c언어에서는 sizeof(arr)을 사용한다.

 

배열에 입력받기

n이 정해진 수가 아니기 때문에 arr[n]을 하면 에러가 뜬다. 위의 사진과 같은 방식은 동적할당을 통해서만 처리해줄 수 있다. 동적할당을 모르는 상태에서는 어떻게 해야할까?

 

이럴때는 그냥 arr의 크기를 최대한 크게 잡아주면 된다.

arr의 크기를 1000으로 잡아준 다음 1000보다 작은 정수 n을 입력받아서 n개의 수를 배열에 넣어주면 된다.

 

배열의 활용 - 최대,최소값/짝수 값 구하기 

배열을 활용해서 최대,최소값을 구해보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
int main() {
    
    int n;
    int arr[1000];
    printf("입력할 숫자의 개수:");
    scanf_s("%d"&n);
    for (int i = 0; i < n; i++) {
        scanf_s("%d"&arr[i]);
    }
    int max = arr[0];
    for (int i = 0; i < n; i++) {
        if (max < arr[i]) {
            max = arr[i];
        }
    }
    printf("최대값은 %d\n",max);
 
    int min = arr[0];
    for (int i = 0; i < n; i++) {
        if (min > arr[i]) {
            min = arr[i];
        }
    }
 
    printf("최솟값은 %d\n", min);
}
cs

 

 

 

짝수의 개수를 구하려면 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#include <stdio.h>
 
int main() {
    
    int n;
    int arr[1000];
    printf("입력할 숫자의 개수:");
    scanf_s("%d"&n);
    for (int i = 0; i < n; i++) {
        scanf_s("%d"&arr[i]);
    }
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i]%2==0) {
            cnt++;
        }
    }
    printf("짝수의 개수는 %d\n", cnt);
 
 
}
cs

 

2차원 배열 

정수형의 3행 4열의 배열을 만들려면

int arr[3][4]; <-- 이런식으로 선언해 주면 된다. 

중괄호를 통해 3행 4열의 배열을 완성해 줄 수 있다. 

2차원 배열은 이중 for문을 이용해 출력할 수 있다.

파스칼의 삼각형

파스칼의 삼각형은 확률과 통계 이항정리 시간에 배운 개념이다.

파스칼의 삼각형 공식을 이항계수를 통해 나타내면 nCr=n-1Cr-1+n-1Cr 이되는데

이 공식을 이용하여 코드로 구현해볼 것이다.

 

코드로 구현할 때는 파스칼의 삼각형을 왼쪽으로 밀어버릴건데

이런형태가 나온다.

예를 들어 p[2][1]=2 인데, 어떻게 2가 나왔는지 원리를 살펴보면

p[1][0]+p[1][1]이 더해져서 2가 나온 것이다.

이걸 일반화 시키면 p[i][j]=p[i-1][j-1]+p[i-1][j]가 된다

 

하지만 j(열)가 0일때나 i(행)==j(열) 일때는 1이 되기 때문에

 

if(j==0|| i==j){

   p[i][j]=1;

}

 

로 설정해주면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main() {
    
/*
1
1 1
1 2 1
1 3 3 1
1 3 6 4 1
i행 j열 [i-1 j-1] + [i-1 j]
j==0|| j===i 이면 1 
*/
    int p[10][10];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0 || j == i) {
                p[i][j] = 1;
            }
            else {
                p[i][j] = p[i - 1][j - 1+ p[i - 1][j];
            }
            printf("%d", p[i][j]);
        }
        printf("\n");
    }
}
cs

 

 

출력값

 

문자열 

 

arr의 크기를 구하면 3이 나와야할 것 같은데 4가 나온다! 무슨일일까?!!

 

사실상 char arr[]={'a','b','c','\0'}이다. 그래서 크기가 4가 나오는 것이고, 여기서 '\0'은 문자열의 끝을 알리는 문자이다. 이걸 null문자라한다.

 

문자열을 입력받을 땐 &s 가 아니라 s만 넣어준다. (반드시 기억하기!)

참고로 c++에서는 배열형태도 문자열을 만드는게 아닌 string이라는 자료형이 있다. 

 

#include<stdio.h>의 의미

 

stdio.h라는 파일이 있는데 이걸 포함시키겠다는 의미이다.

문자열을 쓸때도 #include<string.h>를 해줘야한다.

 

strlen

 

len값은 5인데, len2의 경우 scanf를 통해 똑같이 "Hello"를 입력받아준다 해도 문자열의 길이가 99일 것이다.

이런경우를 해결해주기 위해 string.h에 저장되어있는 함수인 strlen이 있다.

1
2
3
4
5
6
7
8
9
10
11
 
#include <stdio.h>
#include<string.h>
 
int main() {
 
    char str[100= "Hello";
    int len = strlen(str);
    printf("%d", len);
 
}
cs

len의 값을 출력하면 5가 나온다.배열의 크기와 문자열의 크기가 다를 때, strlen을 사용해주면 문자열의 크기를 출력해줄 수 있다.

strcpy

cpy가 copy의 약자로, strcpy(사본,원본); 꼴로 나타낸다.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include<string.h>
 
int main() {
 
    char str[] = "Hello";
    char str2[100];
    strcpy_s(str2,str);//copy의 약자 strcpy(사본,원본); 꼴 
    printf("str2의 값 %s\n", str2);
}
cs

str값을 str2에 복붙해준다는 의미로 str2를 출력하면 

 

strcat

 

문자열 뒤에 문자열을 덧붙여주는 함수이다.

 

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include<string.h>
 
int main() {
 
    char str[100] = "Hello";
    strcat_s(str, "World!");
    printf("%s\n", str);
}
cs

 

strcat만 하면 unsafe하다고 나와서 strcat_s로 해줬다.

strcat해주면 HelloWorld!라고 나온다. 

 

strcmp

 

cmp는 compare를 의미하고, 두 문자열을 비교한다. 사전 순으로 누가 먼저 오는지도 알 수 있다. 

 

int cmp=strcmp(str1,str2) 일 때 

str1이 str2보다 사전순으로 

앞에 있으면 -1반환

같으면 0 반환

뒤에 있으면 1반환

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include<string.h>
 
int main() {
 
    char str1[] = "sample";
    char str2[] = "simple";
    int cmp = strcmp(str1, str2);
    printf("%d\n", cmp);
}
cs

이경우는 str1이 str2보다 사전순으로 앞에 오므로 -1이 출력된다. 

728x90
반응형

'C > 기초(두들낙서)' 카테고리의 다른 글

[C기초] 포인터와 배열 연습문제  (0) 2022.01.08
[C기초] 포인터 배열  (0) 2022.01.04
[C 백준] 브론즈 3/ 세 수  (0) 2022.01.02
[C기초] 배열 포인터  (0) 2022.01.02
[C기초] 포인터 /포인터와 배열  (0) 2022.01.02

댓글