영감을 (inspire) 주고픈 개발 블로그

C / C++ string 정리 본문

컴퓨터 이론/개념

C / C++ string 정리

inspire12 2016. 9. 7. 01:28

자바로 처음 개발을 시작한 사람들은 string을 쓸 때 사칙연산이 먹히지 않는 것에 당황한다. (내가 그랬다.)


그런 사람들을 위한 함수들을 정리했다.


배경지식 


  1. c에서 string은 char 배열과 같다. 
  2. 배열은 포인터다.
  3. 따라서 A = B 가 먹지 않는다. (배열은 주소값을 변경할 수 없는 상수형 포인터로 첫 주소를 꼭 알아야하기 때문입니다.)
  4. 문자열 배열의 끝엔 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 안써도 됨)


* 원본 문자열에 영향 끼치지 않고 바꾼 값 반환

#include <string> #include <iostream> 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

반응형