대학교_1학년/C프로그래밍 및 실습

C프로그래밍 및 실습 - 배열/문자열

대학기록 2024. 11. 8. 17:54

함수에서 중요한 것은 입력은 여러개가 될 수 있지만, 출력은 반드시 한 개라는 것이다. 
 
 
함수를 정의하는 기본적인 형식
리턴형 함수명 (데이터형 매개변수명 [, 데이터형 매개변수명, ..])
{
       문장;
}
 
 
 
예를 들자면,
int GetFactorial(int num)  ->  int 형의 값을 리턴하는 함수
void PrintHello(int a, int b)  ->  리턴 값이 없는 함수
이다.
 
 *참고로 매개변수는 개수에 제한이 없다.(매개변수를 갖지 않을떄는 () 안에 void라고 적는다.)
 
 
 
 
 
리턴 값도 없고 매개변수도 없는 함수의 호출

 
 
 
리턴 값은 없지만 매개변수는 갖는 함수

 

 
추가적으로, 같은 함수를 여러번 호출하는 방법도 있다. 
 
#include <stdio.h>
void TestLocal(void);

int main(void) {
     TestLocal();
     TestLocal();                              //같은 함수를 여러번 호출
}

void TestLocal(void) {
      int num = 0;
      printf("num = %d\n", num++);
}
 
>>>num = 0
      num = 0
 
 
 
 

 
지역변수
: 함수 안에 선언된 변수로 지역 변수가 선언된 함수 안에서만 사용 가능.
: 서로 다른 함수에서 같은 이름의 변수를 선언하면, 이름은 같지만 서로 다른 변수가 된다. 

'main 함수에 선언된 count 변수의 사용범위' 는 PrintCount 함수 위쪽만 해당됨. 
' PrintCount 함수에 선언된 count 변수의 사용범위' 는 main 함수 아래쪽만 해당됨. 
-->따라서 count 변수는 이름은 같지만 서로 다른 변수이다.
 
 

 
 
전역변수
: main 함수 전체에 함수 밖에 선언한다. 
: 지역변수는 이전함수 값을 기억하지 않지만, 전역변수는 이전함수 값을 기억한다. 

 
*추가적으로 전역변수에는 g_를 접두사로 붙이기도 한다. 
 



 
이제 배열에 대해서 알아보자.
 
형식은
데이터형 배열명 [크기];
이다. 
 
예를 들자면,
int arr[5]; -> 크기가 5인 int 배열을 선언한 것이다. 
 
 
 
배열의 선언 및 사용의 예시를 들어보자.

int arr[5]; --> int 배열의 선언
 
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;     -->   배열의 사용
 
마지막이 배열의 각 원소 출력으로 이루어져있다. 
 
 
 
 
배열은 선언 후에 반드시 초기화 해주어야한다. 
초기화해주지 않은 배열은 쓰레기 값을 갖게 된다. 
 
 
 
 
 
배열의 더 응용된 다른 예시를 들어보자.

int arr[5] = { 0 };  --> 로 배열 선언과 동시에 초기화 해주었다.
 
for (int i = 0; i < 5; i++) {
      scanf("%d", &arr[i]);
}                                   --> 로 반복문을 이용해서 배열을 입력받는다. 
 
for (int i = 0; i < 5; i++) {
      sum += arr[i];         --> 로 앞에서 입력받은 배열의 합계를 구한다. 
}
 
aver = (double)sum / 5;   --> 에서 소숫자리로 나올수 있으니까 (double)을 붙혀준다. 
그리고 aver 과 sum 을 출력한다. 
 
 


 
이제 2차원배열 에 대해서 알아보자.
 
형식은,
데이터형 배열명 [제1크기][제2크기]
이다. 
 

예시를 들어보자면,
short data [2][3];
에서 가장 오른쪽 인덱스부터 증가된다. 
 
data[0][0] = 1;
data[0][1] = 2;
data[0][2] = 3;
 
data[1][0] = 4;
data[1][1] = 5;
data[1][2] = 6; --> 왼쪽 인덱스가 증가됨 ( [1] )
 
 
 
*이차원 배열문제를 풀 때는 이중반복문을 사용해주어야한다.(일차원 배열문제에서 for문을 사용한 것처럼)
 
 

예시문제를 들어보자. 

short arr[2][3];  --> 이차원 배열 선언
 
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;  --> 이차원 배열 사용
 
for (int i = 0; i < 2; i++) {
     for (int j = 0; j < 3; j++) {
          printf("%d ", arr[i][j]);
     }
     printf("\n");
}                                    --> 이차원 배열 출력
 
 

 
추가적으로, 이차원배열을 초기화하는 데에는 여러가지 방법이 있다. 
1) short data[2][3] = {{1,2,3},{4,5,6}};
*short data[2][3] = {{1,2,3},{4,5,6}};  와  short data[2][3] = {1,2,3,4,5,6}; 는 같은 의미이다. 
 
2) int a[][2] =  {1,2,3,4,5,6}; (int a[3][2]; 로 할당된다.)
*int b[3][] = {1,2,3,4,5,6}; -> 컴파일 에러
 
 
 
 
 
이제, 문자열에 대해서 알아보자. 
 
문자열
: 연속된 문자들의 모임으로 큰 따옴표(" ")로 표현한다. 
: 문자열의 끝에는 널 문자('\0')를 함께 저장한다. 
 

문자열 상수 : 값이 변경되지 않는 문자열 
문자열 변수 : 프로그램 수행 중에 값이 변경되될 수 있는 문자열 
 
 
문자 배열의 크기"저장할 문자열의 길이 +1"로 할당해야 한다. 
예를 들어서
char str[10]; --> 길이가 9인 문자열을 저장하기 위한 문자 배열을 선언한다. 
 
 
문자 배열도 인덱스를 이용해서 배열의 원소에 접근할 수 있다. 
 

str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\n';   --> 문자 배열의 각 원소를 변경한다. 
 
그 후에 문자 배열의 각 원소를 출력한다. 
 
 
 
 
문자 배열의 초기화 에는 여러가지 방법이 있다. 
1) 문자열 상수를 이용해서 초기화한다. 
char str[4]  = "abc";
2) 초기값을 지정할 때는 문자 배열의 크기를 생략할 수 있다. 
char str[] = "Hello";   -->  str의 크기가 6인 배열로 할당된다. 
 
 
 
문자배열의 출력 에도 여러가지 방법이 있다. 
1) 문자열을 한번에 출력하러면 "%s"로 지정한다. 
printf("%s", str);
2) 문자 배열을 직접 printf 함수의 첫 번쨰 인자로 넘겨줄 수도 있다. 
printf(str)  --> str 배열에 보관된 문자열을 출력한다. 
 
 
 
문자 배열 사용시 주의사항!
배열의 원소가 아닌 문자배열 전체에 직접 다른 문자열을 대입할 수 없다. 
--> char str[10] ="abc";
     str = "Hello"   (컴파일에러)
 
 
각 문자를 하나씩 변경하는 것은 가능하다. 

 
 
하지만, 복잡하기 때문에 보통은 문자열 처리 함수를 이용한다. 
이용하기 위해서는 #include <string.h> 를 포함해야 한다. 
 
 
문자열 처리함수에는 strcpy(), strlen(), strcmp(), strcat() 함수가 있다. 
 
 

1) strcpy(값을 넣을 문자배열, 복사할 문자배열)
: 문자열을 직접 대입하는 대신에 이용한다. 
 

 
 
 
2) strlen(제일 뒤의 널 문자를 제외한 문자열의 길이 구함)

 
 
 
 
3) strcmp(첫번째 문자배열, 두번째 문자배열) 비교해주는 함수
: 문자열의 내용을 비교하려면 strcmp 함수를 사용해야 한다.
 

str1과 str2가 동일하면 '0'이 출력된다. 
 
 

str1이 str2보다 크면 '1'이 출력된다. 
 
 

str1이 str2보다 작으으면 '-1'이 출력된다. 
 
 
 
4) strcat(앞에 문자열, 뒤에 붙을 문자열)
: 문자 배열의 끝에 다른 문자열을 연결할 때 이용

 
 

 
우리가 자주 사용하던 scanf()와 printf() 함수는 문자열을 입력력받을 때는 둘다 %s 를 사용한다. 
 
 
 
scanf 함수 사용 시 주의사항 !!
- scanf 함수는 입력된 내용 중 항상 공백문자 까지만을 입력으로 읽어온다. 
- 따라서 빈칸을 포함한 문자열을 입력받으려면 scanf 함수 대신 gets 함수를 이용해야 한다.   
 

 
gets() : 빈칸을 포함한 한 줄의 문자열을 입력받는 데 사용
puts() : 한 줄의 문자열을 출력하는 데 사용 + 자동으로 줄 바꿈 문자를 출력
sprintf() : springf(배열명, 출력내용, %s에 넣을내용)
ex) springf(str,"a = %d, b = %d",a,b);
 
 
 
 
만약, 빈칸을 포함한 문자열을 입력받았는데 scanf를 사용한다면 어떻게 출력될까? 

 
 
 
gets() 함수를 이용해보자. 

 
 

 
문자열 배열에 대해서 알아보자.
 -문자열을 여러 개 저장하려면문자 배열을 이차원 배열로 선언해야 한다.
 -제2크기는 제장할 문자열의 길이+1로 지정하고, 제1크기는 필요한 문자열의 개수로 지정한다.
ex) char[3][5];  --> 최대 길이가 4인 문자열을 3개 저장함
 
 
 
 
문자열 배열에 인덱스를하나만사용하면 배열에 보관된 문자열에 접근한다 .     

 
 

문자열 배열의 초기화 
-{ } 안에문자열 상수들을 나열한다.  
ex) char weekdays[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
 
- 문자열 배열도 초기값을 지정 할때는 배열의 제1크기를 생략 할 수 있다.