연락처 출력 함수
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 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구조체에 대한 포인터를 매개변수로 받습니다.fgets()를 사용하여 각 문자열 필드(name, phone, email)를 읽어 공백이 포함된 이름도 허용하도록 합니다.strcspn()을 사용하여 각 문자열 필드를 읽은 후 끝에 붙은 개행 문자를 제거합니다.scanf("%d", ...)를 사용하여 정수형 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(), 그리고 데이터 분류를 위한 조건부 로직의 사용을 연습하게 됩니다. 매개변수 선언에서 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;
}