일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 성능테스트
- 개발 flow
- mac 화면분할
- 프로그래밍
- aws
- 알고리즘분류
- 커스텀단축키
- 초년생
- 알고리즘사이트
- 오블완
- 대규모 시스템 설계
- spring boot
- 코드트리
- 편한 즐겨찾기 편집
- Java
- 소프트웨어 지표
- 알고리즘초보
- 주식기본기
- 스프링부트
- 자동화
- ui 커스텀
- 알고리즘 추천
- 코딩
- Spring 문서 따라하기
- 기능 많은 브라우저
- 브라우저 단축키
- 가발자 인사이드아웃
- JMeter
- 알고리즘
- 문서 따라하기
- Today
- Total
영감을 (inspire) 주고픈 개발 블로그
C / C++ string 정리 본문
자바로 처음 개발을 시작한 사람들은 string을 쓸 때 사칙연산이 먹히지 않는 것에 당황한다. (내가 그랬다.)
그런 사람들을 위한 함수들을 정리했다.
배경지식
- c에서 string은 char 배열과 같다.
- 배열은 포인터다.
- 따라서 A = B 가 먹지 않는다. (배열은 주소값을 변경할 수 없는 상수형 포인터로 첫 주소를 꼭 알아야하기 때문입니다.)
- 문자열 배열의 끝엔 NULL 값이 들어간다. 이 값을 통해 문자열이 끝났다는 걸 알려준다.
자세한 내용은 자니의 세상 블로그에 포스팅 된 내용을 참고 하면 좋다.
실 사용
String을 쓰려 할 때 알아야 할 함수들 #include <string.h> 에 존재
- char A[100], B[100];
- 이때 배열의 크기는 제한입니다. 어느정도 들어올건지 예상해서 넉넉히 잡는 게 좋습니다.
A = "abcd";
B = "efgh";
- A = B; 는 strcpy(A,B);
- A = A+B; 는 strcat(A,B);
- A == B; 는 strcmp(A,B); (주의: ASCII code 를 비교하는 것! 10과 9 비교하면 9가 크게 나온다.)
0 = 결과 값이면 s1 = s2 |
0 < 결과 값이면 s1 > s2 |
0 > 결과 값이면 s1 < s2 |
- 해당 문자열에 존재하는 가? strstr(A,B);
strcat(A,B) 함수 모양은 다음과 같습니다.
void strcat(char* dest, char* src){
while(*dest) dest++; // NULL이 나올때 까지 찾습니다. 그 이후 붙여줍니다.
while(*dest++=*src++);
}
3번째 줄을 보면 메모리 제한이 없습니다. 따라서 스택오버플로우 문제 위험이 있습니다.
strn~ 을 사용하면 보다 안전하게 사용할 수 있습니다.
C++
C++에선 라이브러리를 통해 문자열 타입(클래스)가 추가되었습니다.
using namespace std;
std::string
- string 생성
=> char로 활용하기 위해선 선언과 값 지정을 따로
string base = "hello world!";
- 연산자
1) += 연산자
2) append("내용")
- 길이
string base = "hello world!";
base.length();
base.size();
특정 위치 받기( 자바에서 base.charAt( i ) 와 같음 )
char를 반환 base.at( i )
- 문자 탐색
base.find("내용");
=>return 값은 발견된 "첫" 위치- char 기준/ 발견안되면 string::npos
복사, 문자열 비교는 기본 연산자로 가능 - 사전순(equal 안써도 됨)
* 원본 문자열에 영향 끼치지 않고 바꾼 값 반환
using std::string; std::string replaceString(std::string subject, const std::string &search, const std::string &replace) { size_t pos = 0; while ((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); pos += replace.length(); } return subject; }
* 원본 문자열 수정(속도가 더 빠름)
void ReplaceStringInPlace(std::string& subject, const std::string& search, const std::string& replace) { size_t pos = 0; while ((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); pos += replace.length(); } }- 타입 변환 (c++11 이상 지원)
string s;
int i;
char c;
- 숫자 -> 문자(string)
s = std::to_string(i); // g++ -std=c++0x -o test example.cpp 이 옵션을 줘야합니다.
- 숫자 -> 문자(char)
가) i = c- '0'; / i = c- 48; (ascii) ==> #define toDigit(c) (c-'0')
나) i = atoi();
- 문자 -> 숫자
i = std::stoi(s);
난 자바로 처음 코딩을 배웠기 때문에 string 처리하는 고민을 크게 안했었다.
같은 걸 비교할 때 "=" 이 아니라 .equal 의 내장함수를 써야 하는 다는 자잘한 팁을 빼곤
c를 처음 할 때 그래서 char 로 표현된 문자열을 처리하는 게 귀찮았다.
그래서 알고리즘 문제도 문자열을 인식해야하는 건 한동안 자바로 코딩했다.
c++라이브러리를 공부하다보니 자바와 같이 문자열을 처리할 수 있는 string 라이브러리가 있었다!!
기억하기 위해서 정리해본다.
makerj님의 사이트를 참고했습니다.
http://makerj.tistory.com/127
http://makerj.tistory.com/164
'컴퓨터 이론 > 개념' 카테고리의 다른 글
[입문자 2차] 프로그래밍을 공부하려면 뭘 해야할까요? - 생활코딩을 보세요 (0) | 2018.04.24 |
---|---|
[입문자 1차] 모니터 이면의 세계 (0) | 2017.01.04 |
[입문자] 강좌 시작 (0) | 2017.01.02 |