구조체와 문자열 함수

Jaemyeong Lee·2024년 11월 22일
0

어소트락2017

목록 보기
17/20

아래는 제공된 강의 설명과 예제 코드를 한 줄 한 줄 분석하여 자세하게 정리한 내용입니다.


강의 설명 분석

  1. 구조체란?

    • 구조체는 관련 있는 변수들을 묶어서 하나의 새로운 사용자 정의 타입을 생성하는 기능입니다.
    • 예를 들어 학생 정보를 관리할 때, 이름, 학번, 성적 등을 하나로 묶어서 사용할 수 있습니다.
  2. 열거체와 구조체의 차이

    • 열거체는 상수들에 이름을 부여합니다. (ex: enum Color { Red, Green, Blue };)
    • 구조체는 관련된 변수들을 하나의 데이터 집합으로 묶어줍니다.
  3. 구조체의 특징

    • 구조체는 배열과 같이 데이터 집합입니다.
    • 구조체 멤버 변수들은 연속된 메모리 블록에 저장됩니다.
  4. 구조체 멤버 접근

    • 구조체 멤버에 접근하려면 . 연산자를 사용합니다.

예제 코드 분석

코드 작성 및 실행 순서

#define NAME_SIZE 32
  • NAME_SIZE를 32로 정의했습니다.
  • #define은 전처리기 지시자로, 코드 내에서 NAME_SIZE를 32로 치환합니다.
  • 이 값은 이름 문자열의 최대 크기를 제한하기 위해 사용됩니다.

struct _tagStudent
{
    char strName[NAME_SIZE];
    int iNumber;
    int iKor;
    int iEng;
    int iMath;
    int iTotal;
    float fAvg;
};
  • _tagStudent라는 이름의 구조체를 정의했습니다.
  • 이 구조체는 학생의 정보를 저장하는 데 필요한 여러 멤버 변수를 포함합니다:
    • strName: 학생 이름을 저장하는 char 배열 (최대 31글자 + NULL).
    • iNumber: 학번을 저장하는 정수형 변수.
    • iKor, iEng, iMath: 국어, 영어, 수학 점수를 저장하는 정수형 변수.
    • iTotal: 총점을 저장하는 정수형 변수.
    • fAvg: 평균 점수를 저장하는 실수형 변수.

_tagStudent tStudent;
_tagStudent tStudentArr[100] = {};
  • _tagStudent 타입의 변수 tStudent를 선언했습니다. 이는 학생 한 명의 데이터를 저장합니다.
  • _tagStudent 타입의 배열 tStudentArr[100]을 선언하고 초기화했습니다.
    • 배열은 최대 100명의 학생 정보를 저장할 수 있습니다.
    • {}로 초기화했으므로 배열의 모든 값이 0으로 초기화됩니다.

tStudent.iKor = 100;
  • tStudent 구조체의 iKor 멤버에 100을 할당했습니다.
  • . 연산자를 사용하여 구조체 멤버에 접근합니다.

tStudent.strName[0] = 'a';
tStudent.strName[1] = 'b';
tStudent.strName[2] = 0;
  • tStudent.strName 배열에 직접 문자 값을 할당하여 문자열을 생성했습니다.
  • 문자열은 항상 NULL 문자(\0 또는 0)로 끝나야 합니다. 따라서 마지막에 0을 넣어 문자열의 끝을 명시했습니다.

strcat_s(tStudent.strName, "문자열 붙이기");
  • 문자열 붙이기 함수 strcat_s를 사용했습니다.
  • tStudent.strName"문자열 붙이기"를 추가합니다.
  • strcat_s는 기존 문자열 뒤에 새로운 문자열을 붙이고, 자동으로 NULL 문자를 추가합니다.

strcpy_s(tStudent.strName, "홍길동");
  • 문자열 복사 함수 strcpy_s를 사용하여 "홍길동"tStudent.strName에 복사했습니다.
  • 기존 문자열을 덮어씁니다.
  • strcpy_s는 안전하게 문자열 복사를 수행하며, NULL 문자도 자동으로 추가합니다.

cout << "비교할 이름을 입력하세요 : ";
char strName[NAME_SIZE] = {};
cin >> strName;
  • 사용자로부터 이름을 입력받아 strName에 저장합니다.
  • 입력 크기가 NAME_SIZE보다 크면 잘릴 수 있습니다.

if (strcmp(tStudent.strName, strName) == 0)
  • strcmp 함수로 두 문자열을 비교합니다.
    • tStudent.strNamestrName이 같으면 0을 반환합니다.
    • 다르면 0이 아닌 값을 반환합니다.

cout << "이름 길이 : " << strlen(tStudent.strName) << endl;
  • strlen 함수는 문자열의 길이를 반환합니다.
  • NULL 문자는 길이에 포함되지 않습니다.

cout << "이름 : " << tStudent.strName << endl;
cout << "학번 : " << tStudent.iNumber << endl;
cout << "국어 : " << tStudent.iKor << endl;
cout << "영어 : " << tStudent.iEng << endl;
cout << "수학 : " << tStudent.iMath << endl;
cout << "총점 : " << tStudent.iTotal << endl;
cout << "평균 : " << tStudent.iTotal / 3 << endl;
  • 구조체 멤버에 저장된 데이터를 출력합니다.
  • 평균은 iTotal / 3으로 계산되지만, 정수형 나눗셈이므로 실수 값이 아닌 정수 값으로 출력됩니다.

실행 흐름 요약

  1. _tagStudent 구조체 타입을 정의합니다.
  2. tStudent라는 단일 변수와 100개의 배열 변수를 선언합니다.
  3. tStudent의 멤버 변수에 데이터를 할당하거나 문자열을 복사합니다.
  4. 사용자 입력을 받아 문자열 비교를 수행합니다.
  5. 문자열 길이와 구조체 멤버 값을 출력합니다.

주의 사항 및 추가 설명

  1. 문자열 처리

    • 문자열은 항상 NULL 문자로 끝나야 합니다.
    • strcpy_sstrcat_s 같은 안전한 문자열 함수 사용을 권장합니다.
  2. 초기화

    • 구조체 변수를 선언할 때 초기화를 명시하지 않으면 쓰레기 값이 들어갈 수 있습니다.
    • 배열은 {}로 초기화하여 모든 값을 0으로 설정할 수 있습니다.
  3. 정수 나눗셈

    • 평균을 계산할 때 tStudent.iTotal / 3은 정수형으로 계산되므로, 정확한 실수 값을 얻으려면 static_cast<float>를 사용해야 합니다.
  4. 구조체 활용

    • 구조체는 데이터를 논리적으로 묶는 데 유용합니다.
    • 관련 함수들과 함께 사용하면 객체 지향 프로그래밍의 기본을 익히는 데도 도움이 됩니다.
profile
李家네_공부방

0개의 댓글