Menu
CoddyTech

연락처 출력 함수

Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 53번째.

challenge icon

챌린지

쉬움

이전 강의에서 만든 연락처 관리 시스템을 바탕으로, 연락처 정보를 형식에 맞게 표시하는 함수를 작성하세요. 이 강의에서는 필요한 세 가지 새로운 문자열 함수인 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을 반환합니다.

프로그램은 다음을 수행해야 합니다.

  1. 이전 강의와 동일한 Contact 구조체 정의를 사용합니다. 멤버는 다음과 같습니다.
    • 크기가 50인 문자 배열 name
    • 크기가 20인 문자 배열 phone
    • 크기가 40인 문자 배열 email
    • 정수형 age
  2. 이전 강의와 동일한 createContact 함수를 사용합니다. 이 함수는 다음을 수행합니다.
    • Contact 구조체에 필요한 메모리를 동적으로 할당합니다.
    • 모든 멤버를 기본값으로 초기화합니다.
    • 연락처를 가리키는 포인터를 반환합니다.
  3. 다음과 같은 populateContact 함수를 작성합니다.
    • Contact 구조체를 가리키는 포인터를 매개변수로 받습니다.
    • 각 문자열 필드(name, phone, email)를 읽을 때 fgets()를 사용해 공백이 포함된 이름도 입력할 수 있게 합니다.
    • 각 문자열 필드를 읽은 후 strcspn()을 사용해 마지막 개행 문자를 제거합니다.
    • scanf("%d", ...)를 사용해 정수형 나이 필드를 읽습니다.
    • 각 필드를 읽기 전에 개행 문자 없이 다음 프롬프트를 정확히 출력합니다: Enter name: , Enter phone: , Enter email: , Enter age: (따라서 === CONTACT DETAILS ===는 Enter age: 와 같은 줄에 이어서 출력됩니다.)
    • 참고: 이 버전의 populateContact에는 전화번호 길이 검증이 포함되지 않습니다. 테스트 입력에는 555-1234와 같이 짧은 전화번호가 사용되므로 검증을 추가하지 마세요.
  4. 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
      • strchr()를 사용해 이메일에 문자 '@'가 포함되어 있는지 확인하고 다음을 출력합니다.
        • '@'가 있으면: Email format: Valid
        • '@'가 없으면: Email format: Invalid
  5. 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 컴파일러