본문 바로가기
Tech/Coding

C언어 기본] 배열

by redcubes 2024. 3. 22.

목차

A. 선언, 사용

B. 문자를 저장하는 배열

C. 정리하기

A. 선언, 사용

____1. 선언, 사용, 초기화

int ary[5]; // 4바이트 * 5 배열 선언
ary[0] = 10; //사용할 때(첫번째 요소를 10으로)
scanf("%d",&ary[3]); //키보드로부터 입력받아 4번째 요소에 저장

값을저장하지 않으면 가비지 값이 출력,

int ary[5] ={1,2,3,4,5}; //선언과 동시에 초기화, 중괄호로 묶어서.
int ary[5] ={1,2,3}; // 왼ㅉ고부터 차례로 3개 초기화하고 남은 요소는 0으로 채움.

int ary[1000] ={0}; //많은 배열 요소를같은 값으로 초기화. 
int ary[]  = {1,2,3}; //요소 개수생략가능. 
double형 배열과 char형 뱌열을 선언하고 초기화

 

____2. 반복문

for (i = 0; i < 5; i++)
{
	scanf(("%d",&arr[i]);
}

뱌열은 반복문과 조합하는 일이 많다.

____3. sizeof연산자 활용한 배열처리

-배열 요소의 개수가 가변적일 때나 모를 때는 sizeof연산자를 이용하면 된다.

#include <stdio.h>

int main(void)
{
	int score[5];
	int i;
	int total = 0;
	double avg;
	int count;                        // 배열 요소의 개수를 저장할 변수

	count = sizeof(score) / sizeof(score[0]);   // 배열 요소의 개수 계산

	for (i = 0; i < count; i++)       // 11행에서 계산한 count만큼 반복
	{
		scanf("%d", &score[i]);
	}

	for (i = 0; i < count; i++)       // 11행에서 계산한 count만큼 반복
	{
		total += score[i];
	}
	avg = total / (double)count;      // 총합을 count로 나누어 평균 계산

	for (i = 0; i < count; i++)       // 11행에서 계산한 count만큼 반복
	{
		printf("%5d", score[i]);
	}
	printf("\n");

	printf("평균 : %.1lf\n", avg);

	return 0;
}
count = sizeof(score) / sizeof(score[0]);   // 배열 요소의 개수 계산, 결과로 배열 요소의 개수가 나온다.

avg = total / (double)count; // 총합을 count로 나누어 평균 계산 , 평균을 구할 때도 쓴다.

B. 문자를 저장하는 배열

-문자열을 저장할 때 주로 씀.

____1. char형 배열-선언 초기화

- 저장 할 문자 길이보다 최소 1 이상 커야 함. \0(널 문자)가 마지막에 와서 끝을 알려 주어야 해서.

#include <stdio.h>

int main(void)
{
	char str[80] = "applejam";              // 문자열 초기화

	printf("최초 문자열 : % s\n", str);     // 초기화 문자열 출력
	printf("문자열 입력 : ");
	scanf("%s", str);                       // 새로운 문자열 입력
	printf("입력 후 문자열 : %s\n", str);   // 입력된 문자열 출력

	return 0;
}

- 초기화할 때, 일반배열과 같이 중괄호로해도 되지만, 보통 문자열 상수로 초기화함.  

char str[80] = "applejam";              // 문자열 초기화

널 문자는 남는 char형 배열에 저장 널 문자는 아스키 코드값이 0인 문자로, 결국 남는 배열에 0을 저장하는 것.

문자상수로 나타낼 때 \0 으로 씀. 문자열의 끝을 표시. 배열의 크기가 저장한 문자열보다 크더라도 자장한 문자열만큼 표시하기 위한 용도. 

- 주의사항

배열 크기는 넉넉하게

최소한 문자열 길이+1

 

____2. 문자열 대입

-

#include <stdio.h>
#include <string.h>            // 문자열 관련 함수 원형을 모아놓은 헤더 파일

int main(void)
{
	char str1[80] = "cat";
	char str2[80];

	strcpy(str1, "tiger");     // str1 배열에 "tiger" 복사
	strcpy(str2, str1);        // str2 배열에 str1 배열의 문자열 복사
	printf("%s, %s\n", str1, str2);

	return 0;
}

strcpy char형 배열에 새로운 문자열을 저장하는 함수

저장할 문자열의 길이를 파악해서 딱 그 길이만큼만 배열에 복사.(널 길이 포함)

string.h에 있음.

strcpy(str1, "tiger");     // str1 배열에 "tiger" 복사
strcpy(str2, str1);        // str2 배열에 str1 배열의 문자열 복사

배열명은 배열 시작 위치 주소를 가리키기 때문에 문자열 대입 연산자의 왼쪽에 배열명이 올 수 없다.(포인터에서 재확인)

 

____3. 전용 입출력 함수:gets,puts

- scanf는 빈 칸이 있으면 그 전까지만 입력받음.

gets는 빈 칸 포함 한 줄 입력. puts 는 출력(char형 배열명을 주면 문자열출력 후 자동 줄 바꿈.)

문자열 입력 중간에 빈칸이나 탭 문자 사용가능, 엔터키 누르기 전까지 전체를 하나의 문자열로 저장.

입력할 배열의 크기를 검사하지 않으므로 배열보다 긴 문자열을 입력하면 메모리 영역 침범 가능. 입력하는 사람이 메모리 접근 가능.

문자열 끝에 널 문자가 없으면 나올 때 까지 출력-에러도날 수 있음. 

 

대제목C. 정리하기

____1. 요약

배열-관련된 많은 변수를 한 번에 선언하는 효과

초기화엔 중괄호. 활용은 주로 반복문과 sizeof연산.

chha형 배열은 문자열 저장하는 변수의 역할 문자열로 직접 초기화 가능(중괄호 없이)char형 배열에는 대입 연산자가 아니라 strcpy 함수로 문자열 저장

 

____2 .문제풀이

-대소문자 변환프로그램: 키보드 입력으로 문장을 받아서 소문자로 바꾸기. 바뀐 뀐문장과 문자의 수도 출력하기

#include <stdio.h>
#include <ctype.h>

int main(void) {
  char str[100];
  int count = 0;
  printf("문장 입력: ");
  gets(str);
  for(int i=0;i<strlen(str);i++)
    {
      if(isupper(str[i]))
      {
        str[i]=tolower(str[i]);
        count++;
      }
    }
  
  printf("바뀐 문장: ");
  puts(str);
  printf("바뀐 문자 수: %d",count);
  return 0;
}

 

____3. 궁금한 점

https://velog.io/@sp1rit/%ED%91%9C%EC%A4%80-%EC%9E%85%EC%B6%9C%EB%A0%A5%EA%B3%BC-%EB%B2%84%ED%8D%BC

 

표준 입출력과 버퍼

앞에 표준 입출력에 대해 포스팅을 했다. 표준 입출력 함수에는 익히 알고있는 printf, scanf가 있고, fputc, fgetc도 있다. 표준 입출력 함수를 통해 데이터를 입출력 할 때, 그 데이터들은 운영체제(OS)

velog.io

https://8ublictip.tistory.com/7

 

[C언어] 문자열 입력 함수 gets, fgets 사용법과 비교

아마 C언어를 처음 배우실 때 가장 먼저 배우는 함수가 "Hello World!"를 출력하기 위한 printf() 함수고, 그 다음으로 많이 배우는 함수가 값을 입력받기 위한 scanf()가 아닐까 싶습니다. scanf()는 대표

8ublictip.tistory.com

https://m.blog.naver.com/squel819/100070716966

 

시스템보안 8일차 - 버퍼 오버 플로우 (Buffer Over Flow) - gets() 취약점 이용

gets()함수의 취약점을 이용한 overflow 예제   base2 라는 실행프로그램은 gets 함수를 이용하여 문...

blog.naver.com

https://andyader.blogspot.com/2014/03/gets.html

 

gets 함수는 사용하지 말아야 한다.

C 프로그래밍을 하는 고수 프로그래머의 대부분(아니 거의 전부) 는 다들 gets 함수를 사용하지 말라고 조언한다. 그 이유에 대해서 1988년 엄청난 피해를 입혔던 모리스 웜(Morris Worm) 에 대해 언급

andyader.blogspot.com

-

https://www.reddit.com/r/ProgrammerHumor/comments/xpuq43/i_dont_know_of_any_other_languages_that_allow_this/?rdt=51280&onetap_auto=true&one_tap=true

https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-C-cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B2%95

 

[백준] C++ cin, cout 입출력 속도 빠르게 하는 법

나는 C++을 이용해서 백준 문제를 풀고있다. 그런데 풀다가 이상한 광경을 목격했다. 다른 사람의 코드를 봤는데, 분명 나와 코드 구조는 같은데 실행 시간이 훨씬 빨랐다. 뭐가 다른걸까 비교해

velog.io