본문 바로가기

c언어

9. 포인터와 메모리 관리

1. 한글 이름 두 개를 입력받은 후, 같은 성인지 비교하여 같은 성이면 '같음', 그렇지 않으면 '다름'이라는 문자열을 출력하는 프로그램을 작성하세요. 단, 만일 사용자가 문자열을 입력하지 않았다면 무조건 '다름'이라고 출력합니다.

 

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(void)
{
	char szName1[10] = { 0 };
	char szName2[10] = { 0 };
	printf("첫번째 이름 입력: ");
	gets(szName1);
	printf("두번째 이름 입력: ");
	gets(szName2);

	if ((szName1[0] != '\0' || szName2[0] != '\0') && memcmp(&szName1[0], &szName2[0], 1) == 0)
	{
		
		puts("같음");
	}
	else
	{
		puts("다름");
	}

	return;
}

[실행결과] 

 

 

2. 두 정수를 입력받아 같은 숫자인지 아닌지 비교하는 프로그램을 작성하세요. 단, == 연산자가 아니라 memcmp() 함수를 사용하세요.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(void)
{
	int nData1 = 0;
	int nData2 = 0;
	printf("두 정수를 입력: ");
	scanf("%d %d", &nData1, &nData2);
	if (memcmp(&nData1, &nData2, 4) == 0)
	{
		puts("같음");
	}
	else
	{
		puts("다름");
	}

	return;
}

[실행결과]

 

 

3. 사용자로부터 정수를 입력받은 후, 그 정수의 크기만큼(바이트 단위) 메모리를 동적으로 할당받고 0으로 초기화하는 프로그램을 작성하세요. 단, 정수의 값이 100을 초과하면 강제로 100으로 조정하고, 10보다 작은 경우에는 10으로 조정합니다.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(void)
{
	int nSize = 0;
	int* pnData = NULL;
	printf("Input memory size: ");
	scanf("%d", &nSize);
	if (nSize > 100)
	{
		nSize = 100;
	}
	else if (nSize < 10)
	{
		nSize = 10;
	}

	pnData = (int*)malloc(sizeof(int) * nSize);
	if (pnData != NULL)
	{
		memset(pnData, 0, sizeof(int) * nSize);
		free(pnData);
	}

	return;
}

[실행결과]

 

 

4. 사용자가 입력할 문자열의 최대 길이를 입력받아서 그 크기만큼 메모리를 동적으로 할당받고, 다시 사용자로부터 문자열을 입력받아서 동적으로 할당받은 메모리에 저장합니다. 그리고 메모리에 대한 포인터 변수와 반복문, 간접 지정(*) 연산자를 활용하여 사용자가 입력한 문자열의 길이를 출력하는 프로그램을 작성하세요.

[소스코드]

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

void main(void)
{
	int nSize = 0, nLength = 0;
	char* pszData = NULL;

	printf("Input memory size: ");
	scanf("%d", &nSize);
	while(getchar() != '\n') { }		// 입력 버퍼 비우기

	pszData = (char*)malloc(sizeof(char) * nSize);
	if (pszData != NULL)
	{
		memset(pszData, 0, sizeof(char) * nSize);
		printf("Input your string: ");
		gets(pszData, sizeof(char) * nSize);
		while (*(pszData + nLength++) != '\0') { }
		printf("String Length: %d\n", nLength-1);
		free(pszData);
	}

	return;
}

[실행결과]

 

 

5. 4번 문제의 답으로 작성한 코드에 일부 코드를 수정하거나 추가하여 입력받은 문자열을 거꾸로 뒤집어서 출력하는 프로그램을 작성하세요. 단, 문자열을 출력할 때는 putchar() 함수로 한 글자씩 출력해야 하며 한글을 고려하지 않습니다.

[소스코드]

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

void main(void)
{
	int nSize = 0, nLength = 0;
	char* pszData = NULL;

	printf("Input memory size: ");
	scanf("%d", &nSize);
	while(getchar() != '\n') { }		// 입력 버퍼 비우기

	pszData = (char*)malloc(sizeof(char) * nSize);
	if (pszData != NULL)
	{
		memset(pszData, 0, sizeof(char) * nSize);
		printf("Input your string: ");
		gets(pszData, sizeof(char) * nSize);
		while (*(pszData + nLength++) != '\0') {}
		printf("Reverse string: ");
		for (int i = nLength - 2; i >= 0; --i)
		{
			putchar(*(pszData + i));
		}
		free(pszData);
	}

	return;
}

[실행결과]

 

 

6. 정수를 입력받고, 그 개수만큼 char*형을 여러 개 저장할 수 있는 메모리를 동적으로 할당받습니다. 그리고 입력할 문자열의 최대 길이를 입력받아서 해당 크기만틈의 메모리를 동적으로 할당받습니다. 입력받은 문자열을 저장한 후 출력하는 프로그램을 작성하세요. 이해를 돕기 위해 메모리의 구조를 그림으로 표현하면 다음과 같습니다.

그림에 대해서 설명한다면, 사용자는 3을 입력하고서 총 세 번 문자열을 입력합니다. 그리고 가장 긴 문자열의 길이는 13입니다.

[소스코드]

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

void main(void)
{
	char** ppszData = NULL;
	int nCount = 0, nSize = 0;
	
	printf("Input string count: ");
	scanf("%d", &nCount);

	ppszData = (char**)malloc(sizeof(char*) * nCount);
	if (ppszData != NULL)
	{
		memset(ppszData, 0, sizeof(char*) * nCount);

		printf("Input string max length: ");
		scanf("%d", &nSize);
		while(getchar() != '\n') { }

		// input
		printf("[input]\n");
		for (int i = 0; i < nCount; ++i)
		{
			*(ppszData + i) = (char*)malloc(sizeof(char) * nSize);
			if (*(ppszData + i) != NULL)
			{
				printf("%d. Input string: ", i + 1);
				gets_s(*(ppszData + i), sizeof(char) * nSize);
			}
		}

		// output
		printf("[output]\n");
		for (int i = 0; i < nCount; ++i)
		{
			puts(*(ppszData + i));
		}
		
		// deallocate
		for (int i = 0; i < nCount; ++i)
		{
			if (*(ppszData + i) != NULL)
			{
				free(*(ppszData + i));
			}
		}
		free(ppszData);
	}

	return;
}

[실행결과]

 

'c언어' 카테고리의 다른 글

11. 함수  (0) 2023.06.17
10. 배열과 포인터  (0) 2023.06.13
8. 반복문  (0) 2023.06.07
7. 기초 제어문  (0) 2023.06.05
6. 기타 연산자  (0) 2023.05.29