수업일: 2025-09-16
목표: 문자열 다루기(문자 분류/대소문자 변환), 안전한 인덱싱(
size_type), 범위기반 for(값/참조),vector(동적 배열/반복자/용량), 배열·포인터 선언 해석, C-스타일 문자열 상호운용을 직관적으로 이해하고 안전하게 코딩한다.
<cctype>: isalpha/isdigit/ispunct + tolower/touppersize_type)push_back, 용량(capacity), 반복자end 관용구string.c_str() ↔ const char* (수명 주의)string이 안전한 이유char*)은 길이/경계 오류에 취약.std::string은 길이 정보를 내부에 갖고 있어 경계 검사와 자동 메모리 관리가 쉬움.+---------------------+
| 'H' 'e' 'l' 'l' 'o' |
+---------------------+
size()=5, empty()? false
#include <iostream>
#include <string>
#include <cctype> // 문자 분류/변환
using namespace std;
int main() {
string s = "Hello, World!!!";
// [A] 값으로 순회(원본 불변)
size_t punct_cnt = 0;
for (char c : s) { // c는 복사본
if (ispunct(static_cast<unsigned char>(c)))
++punct_cnt;
}
cout << "punct=" << punct_cnt << "\\n"; // 4
// [B] 참조로 순회(원본 수정)
for (char& c : s) {
c = static_cast<char>(toupper(static_cast<unsigned char>(c)));
}
cout << s << "\\n"; // HELLO, WORLD!!!
}
왜 unsigned char로 캐스팅하나요?
toupper/ispunct는 문자 코드가 음수일 때 동작이 미정의일 수 있어요.static_cast<unsigned char>(c)로 안전 보정!