Small Grey Outline Pointer 포인터와 배열 연습문제 풀기, null문자
본문 바로가기
Dev./C++

포인터와 배열 연습문제 풀기, null문자

by sso. 2022. 3. 6.

포인터와 배열 연습문제

#include <stdio.h>

void main() {
	//1~100 까지 배열에 담은 후 홀수만 출력
	int arData[100] = { 0, };

	for (int i = 0; i < 100; i++) {
		arData[i] = i + 1;
		if (arData[i] % 2 == 1) {
			printf("%d\n", arData[i]);
		}
	}




	//1~100까지 배열에 담은 후 짝수의 합 출력
	int arData[100] = { 0, };
	int total = 0;

	for (int i = 0; i < 100; i++) {
		arData[i] = i + 1;
		if (arData[i] % 2 == 0) {
			total += arData[i];
		}
	}
	printf("%d\n", total);





	//A~F까지 중 C를 제외하고 배열에 담은 후 출력
	//0 1 2 3 4=A B C D E => C=2
	//+65 대문자 A의 아스키코드 

	char arData[5] = {' ', };
	for (int i = 0; i < 5; i++) {
		arData[i] =i>1 ? 66+i : 65 + i;
		printf("%c ", arData[i]);
	}







	//5개의 정수를 입력받고 최대값과 최소값 구하기

	int arData[5] = { 0, };

	int max = 0;
	int min = 0;

	for (int i = 0; i < 5; i++) {
		printf("%d 번째 정수: ", i + 1);
		scanf_s("%d", arData+i); //&arData[i] => scanf_s 주소 쓸 때 중복되는 연산이므로 이렇게 쓰지 않아도 된다 

	}

	max = arData[0];
	min = arData[0];

	for (int i = 1; i < 5; i++) { // 0번째 방과 0번 방을 비교하는건 의미가 없으므로 1번 방부터 비교 시작
		if (max < arData[i]) { max = arData[i]; }
		if (min > arData[i]) { min = arData[i]; }
	}

	printf("최대값: %d\n최소값: %d", max, min);






	//aBcDeFgHiJkLmNoPqRsTuVwXyZ 배열에 담기
	//0123456... 짝수일 때 소문자, 홀수 일 때 대문자인 규칙을 찾아야함

	char arData[26] = { ' ', };
	for (int i = 0; i < 26; i++) {
		arData[i] = i % 2 == 0 ? 97 + i : 65 + i;
		printf("%c", arData[i]);
	}







}

문자열: 문자 배열

char 배열명 [길이] = {'문자1', '문자2', ....};
char 배열명 [길이] = "문자열";

 

 

null 문자('\0')
문자열의 끝을 알려주는 문자
널 문자가 있어야지만 정상적으로 문자열을 읽어올 수 있다
문자 배열의 시작 주소를 알려주면 널문자 전까지 읽게 된다
널 문자는 자동으로 문자열 맨 끝에 위치하기 때문에 반드시 문자열의 길이 보다 한칸 더 할당해줘야 한다

 


문자열 입력 
사용자가 할당한 배열의 크기를 넘어가는 문자열을 입력하게 되면 
할당하지 않은 주소에 엉뚱한 값이 들어가버린다
따라서 안전하지 않게 된다. 이를 막기 위해서는 입력함수에 할당한 배열의 크기를 전달함으로서
미리 크기를 넘어가는 문자열을 막아주도록 해준다.

 


scanf_s("서식문자", &저장공간, sizeof(저장공간));

 


저장할 공간의 크기를 미리 알려줌으로서
배열보다 긴 값을 넣을 때 차단해 준다
만약 차단 되면 아무값도 넣지 않는다

 


const char* 포인터명 : 그 주소에 접근 후 수정 불가
const char* const 포인터명 : 주소값 변경 불가

 

string.h


-기존 배열의 값을 전달한 새로운 값으로 변경
strcpy_s(배열명, sizeof(배열명), "새로운 값");

 


-문자열 비교
strcmp(값1, 값2) :
같으면 0, 다르면 1 or -1

-문자열 길이
strlen(배열명) : null문자를 제외한 실제 값의 길이
null 문자를 직접 작성하게 되면 그 앞까지의 문자 개수를 알 수 있다

 

 

 

null 문자

#include <stdio.h>
#include <string.h>

void main() {

	char nation[6] = "korea";

	//nation = "japan"; <- 이렇게 하면 안됨
	// 
	scanf_s("%s", nation, sizeof(nation));
	printf("%s\n", nation);

	strcpy_s(nation, sizeof(nation), "japan");
	printf("%s\n", nation);

	printf("%d\n", strcmp(nation, "japan")); //1 거짓
	printf("%d\n", strcmp(nation, "apple")); // 1 거짓
	printf("%d\n", strcmp(nation, "data"));
	printf("%d\n", strcmp(nation, "korea")); //0 참

	scanf_s("%s", nation, sizeof(nation));
	if (!strcmp(nation, "korea")) {
		printf("두 값은 같은 값입니다.\n");
	}

}

 

 

#include <stdio.h>
#include <string.h>
void main() {
	char nation[6] = "ko\0rea";
	printf("%s\n", nation);
	printf("%d\n", strlen(nation));

}

 

 

 

728x90

'Dev. > C++' 카테고리의 다른 글

2차원 배열 /for문 복습(이중for문)  (0) 2022.03.12
포인터와 배열 응용문제 풀기  (0) 2022.03.06
포인터와 배열  (0) 2022.03.06
반복문 연습문제 풀기  (0) 2022.03.06
연산자 조건문 반복문 문제풀기  (0) 2022.03.05

댓글