연락처 출력 함수
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을 반환합니다.
프로그램은 다음을 수행해야 합니다:
- 이전 레슨과 동일한
Contactstruct 정의를 사용하며, 다음 멤버를 포함해야 합니다:- 크기가 50인 문자 배열
name - 크기가 20인 문자 배열
phone - 크기가 40인 문자 배열
email - 정수
age
- 크기가 50인 문자 배열
- 이전 레슨과 동일한
createContact함수를 사용하며, 이 함수는 다음을 수행해야 합니다:Contactstruct를 위한 메모리를 동적으로 할당합니다.- 모든 멤버를 기본값으로 초기화합니다.
- 연락처를 가리키는 포인터를 반환합니다.
- 다음 작업을 수행하는
populateContact함수를 작성합니다:Contactstruct를 가리키는 포인터를 매개변수로 받습니다.- 각 문자열 필드(name, phone, email)를 읽을 때
fgets()를 사용하여 공백이 포함된 이름도 허용합니다. - 각 문자열 필드를 읽은 후
strcspn()을 사용하여 후행 줄 바꿈을 제거합니다. scanf("%d", ...)를 사용하여 정수 age 필드를 읽습니다.- 참고: 이 버전의
populateContact에는 전화번호 길이 검사가 포함되지 않습니다. 테스트 입력에서는555-1234와 같이 짧은 전화번호를 사용하므로 이를 추가하지 마세요.
displayContact라는 이름의 함수를 작성합니다. 이 함수는 다음을 수행해야 합니다:Contactstruct를 가리키는 상수 포인터를 매개변수로 받습니다: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를 출력합니다.
이 챌린지에서는 struct를 가리키는 상수 포인터를 받는 표시 함수를 작성하는 방법을 보여 줍니다. 이를 통해 함수가 원본 데이터를 수정할 수 없도록 합니다. 공백이 포함된 문자열을 읽기 위한 fgets() 사용법, 후행 줄 바꿈을 제거하기 위한 strcspn() 사용법, 포인터를 통해 struct 멤버에 접근하기 위한 화살표 연산자, 문자 검색을 위한 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;
}논리 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러