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;
}
[실행결과]