연락처 출력 함수
Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 53번째.
챌린지
쉬움이전 강의에서 만든 연락처 관리 시스템을 바탕으로, 연락처 정보를 형식에 맞게 표시하는 함수를 작성하세요. 이 강의에서는 필요한 세 가지 새로운 문자열 함수인 fgets(), strcspn(), strchr()를 소개합니다. 요구 사항을 살펴보기 전에 각 함수를 아래에서 설명합니다.
이 강의에서 사용하는 새 함수:
fgets(buffer, size, stdin): 공백을 포함한 입력 한 줄을 읽습니다(공백 문자를 만나면 읽기를 멈추는scanf와 다릅니다). 입력을buffer에 저장하며, 최대size - 1개의 문자를 읽습니다. 또한 끝에 개행 문자'\n'를 저장합니다.strcspn(str, "\n"):str에서'\n'이 처음 나타나는 위치의 인덱스를 반환합니다.fgets가 남긴 마지막 개행 문자를 제거하는 데 사용합니다:str[strcspn(str, "\n")] = '\0';strchr(str, ch):str에서 문자ch를 검색해 해당 위치를 가리키는 포인터를 반환합니다. 찾지 못하면NULL을 반환합니다.
프로그램은 다음을 수행해야 합니다.
- 이전 강의와 동일한
Contact구조체 정의를 사용합니다. 멤버는 다음과 같습니다.- 크기가 50인 문자 배열
name - 크기가 20인 문자 배열
phone - 크기가 40인 문자 배열
email - 정수형
age
- 크기가 50인 문자 배열
- 이전 강의와 동일한
createContact함수를 사용합니다. 이 함수는 다음을 수행합니다.Contact구조체에 필요한 메모리를 동적으로 할당합니다.- 모든 멤버를 기본값으로 초기화합니다.
- 연락처를 가리키는 포인터를 반환합니다.
- 다음과 같은
populateContact함수를 작성합니다.Contact구조체를 가리키는 포인터를 매개변수로 받습니다.- 각 문자열 필드(name, phone, email)를 읽을 때
fgets()를 사용해 공백이 포함된 이름도 입력할 수 있게 합니다. - 각 문자열 필드를 읽은 후
strcspn()을 사용해 마지막 개행 문자를 제거합니다. scanf("%d", ...)를 사용해 정수형 나이 필드를 읽습니다.- 각 필드를 읽기 전에 개행 문자 없이 다음 프롬프트를 정확히 출력합니다:
Enter name:,Enter phone:,Enter email:,Enter age:(따라서=== CONTACT DETAILS ===는Enter age:와 같은 줄에 이어서 출력됩니다.) - 참고: 이 버전의
populateContact에는 전화번호 길이 검증이 포함되지 않습니다. 테스트 입력에는555-1234와 같이 짧은 전화번호가 사용되므로 검증을 추가하지 마세요.
displayContact라는 함수를 작성합니다. 이 함수는 다음과 같이 동작해야 합니다.Contact구조체를 가리키는 상수 포인터를 매개변수로 받습니다:const struct Contact *contactPtr- 아무것도 반환하지 않습니다(void).
- 연락처 정보를 다음 형식으로 정확히 출력합니다.
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- 기본 정보를 표시한 후 추가 정보를 계산해 표시합니다.
strlen()을 사용해 이름의 길이를 계산하고 다음을 출력합니다:Name length: [length] characters- 나이를 기준으로 세대 범주를 정하고 다음을 출력합니다.
- 나이가 0~12인 경우:
Generation: Child - 나이가 13~19인 경우:
Generation: Teenager - 나이가 20~39인 경우:
Generation: Young Adult - 나이가 40~59인 경우:
Generation: Middle-aged Adult - 나이가 60 이상인 경우:
Generation: Senior
- 나이가 0~12인 경우:
strchr()를 사용해 이메일에 문자'@'가 포함되어 있는지 확인하고 다음을 출력합니다.'@'가 있으면:Email format: Valid'@'가 없으면:Email format: Invalid
- main 함수에서는 다음을 수행합니다.
createContact함수를 사용해 연락처를 만듭니다.- 연락처 생성이 성공했는지 확인합니다.
populateContact함수를 호출해 연락처 데이터를 입력합니다.displayContact함수를 호출해 형식에 맞춘 연락처 정보를 표시합니다.- 동적으로 할당한 메모리를 해제합니다.
Program completed successfully을 출력합니다.
이 과제에서는 구조체를 가리키는 상수 포인터를 받는 표시 함수를 만드는 방법을 살펴봅니다. 이를 통해 함수가 원본 데이터를 수정할 수 없도록 합니다. 공백이 포함된 문자열을 읽는 fgets(), 마지막 개행 문자를 제거하는 strcspn(), 포인터를 통해 구조체 멤버에 접근하는 화살표 연산자, 문자를 검색하는 strchr()</> 및 데이터를 분류하는 조건문을 연습하게 됩니다. 매개변수 선언에 <code>const를 사용하는 것은 표시 함수 안에서 연락처 데이터를 실수로 수정하지 않도록 막아 주는 좋은 방법입니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[50];
char phone[20];
char email[40];
int age;
} Contact;
Contact* createContact() {
Contact* contact = (Contact*)malloc(sizeof(Contact));
if (contact == NULL) {
return NULL;
}
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
return contact;
}
void populateContact(Contact* contactPtr) {
printf("Enter name: ");
scanf("%s", contactPtr->name);
printf("Enter phone: ");
scanf("%s", contactPtr->phone);
printf("Enter email: ");
scanf("%s", contactPtr->email);
printf("Enter age: ");
scanf("%d", &contactPtr->age);
if (contactPtr->age < 0 || contactPtr->age > 120) {
printf("Invalid age entered\n");
} else if (strlen(contactPtr->phone) < 10) {
printf("Invalid phone number\n");
} else {
printf("Contact populated successfully\n");
}
}
int main() {
Contact* contact = createContact();
if (contact == NULL) {
return 1;
}
populateContact(contact);
printf("Contact Information:\n");
printf("Name: %s\n", contact->name);
printf("Phone: %s\n", contact->phone);
printf("Email: %s\n", contact->email);
printf("Age: %d\n", contact->age);
free(contact);
printf("Contact deleted successfully\n");
return 0;
}논리 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러