• Home
  • About
    • Jiwon Jeong photo

      Jiwon Jeong

      끊임없이 배우며 성장하는 엔지니어

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
    • All Categories
  • Projects

문자열 함수 정리

03 May 2021

Reading time ~3 minutes

문자열 String 클래스 멤버함수 정리

  • string str1 = “BlockDMask”;

  • string str2 = “BlogBlogBlogBlog”; 인 상태에서 시작

String 인자 접근, Access 관련

str.at(인덱스)

  • str1.at(0); //”BlockDMask” -> ‘B’를 리턴합니다.

str.front(), str.back()

  • str1.front(); //”BlockDMask” -> ‘B’를 리턴합니다.
  • tr1.back(); //”BlockDMask” -> ‘K’를 리턴합니다.

String 사이즈 관련

str.size() = str.length()

  • str1.size(); // “BlockDMask” 이므로 10을 반환합니다.

str.clear()

  • str1.clear(); //”BlockDMask” -> “” 이 됩니다. size와 lenth는 0이 되고, capacity는 15 그대로 입니다. (메모리 해제가 아닌 문자열 값 삭제하는것)

str.empty()

  • if(str1.empty()) { return true; }

String 다양하게 가지고 놀기

str.substr()

  • str1.substr(); //”BlockDMask” 그대로 반환합니다.
  • str1.substr(5); // “DMask”를 반환합니다. 0부터 세기 시작해서 “5” 번째 인자부터 끝까지의 문자열을 반환합니다.
  • str1.substr(5, 1); // “D”를 반환합니다. 5번째 인자부터, 1의 길이만큼 문자열을 반환합니다.

  • 문자열을 정수로 바꾸기(프로그래머스)
#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    
    if(s[0] == '-'){
        answer = (-1) * stoi(s.substr(1));
    }else if(s[0]== '+'){
        answer = stoi(s.substr(1));
    }else{
        answer = stoi(s);
    }
    
    return answer;
}

str.replace()

  • str1.replace(5, 2, str2); // “BlockDMask”의 5번째 인자에서부터 2개를 str2로 대체하게 됩니다. 그러면 “BlockBlogBlogBlogBlogask”

str.compare()

  • str1.compare(str2) // c가 g보다 사전상 더 앞선글자이기 때문에 c가 더 작은 글자가 됩니다. 그렇기 때문에 음수(-1)를 반환
  • str2.compare(str1); // 양수(1)을 반환
  • str1.compare("BlockDMask"); //이 경우에는 두 스트링이 같기 때문에 0을 반환
  • str1.compare(0, 2, str2); // str1인 “BlockDMask”의 0번째 인덱스 부터 길이가 2인 문자열 “Bl”과 str2인 “BlogBlogBlogBlog” 를 비교합니다. 두 문자열이 다르기 때문에 0이 아닌 수를 반환
  • str1.compare(0, 2, str2, 4, 2); //str1의 “BlockDMask”의 0번째 인덱스 부터 길이 2인 문자열 “Bl”과 str2 문자열 “BlogBlogBlogBlog” 3번째 인덱스 부터 길이가 2인 문자열인 “Bl”을 비교합니다. 비교할 문자열이 같기 때문에 0을 반환

str.copy()

  • int arrLen = str1.copy(arr, 3, 5); //5번째 index부터 3의 길이만큼 복사 한다는 거니까 Mask부분이 들어갔을겁니다. 그리고 반환하는 arrLen은 3

str.find()

  • str2.find(“Blog”); // “BlogBlogBlogBlog” -> 0 을 반환
  • str2.find(“Blog”, 5); // 5번째 인자부터 blog를 찾게되니 BlogBlogBlogBlog 표시된 l에서부터 찾게됨, b의 위치인 8을 반환할 것

  • 서울에서 김서방찾기 (프로그래머스)
#include <string>
#include <vector>

using namespace std;

string solution(vector<string> seoul) {
    string answer = "김서방은 ";
    for(int i=0; i<seoul.size(); i++){
        if(seoul[i].find("Kim")==0){
            answer += to_string(i);
        }
    }
    answer += "에 있다";
    return answer;
}

문자열 중 숫자가 들어갔는지 판별

  • isdigit 함수 활용!
#include <string>

using namespace std;

bool solution(string s) {

    if(s.size()!=4 && s.size()!=6){
        return false;
    }
    
    for(char c:s){
        if(isdigit(c)==false)
            return false;
    }
        
    return true;
}

문자열 내 마음대로 정렬하기 (프로그래머스)

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int g ;

bool compare(string a, string b){
    if(a[g] != b[g]){
        return a[g] < b[g];
    }else{
        return a < b;
    }
}
vector<string> solution(vector<string> strings, int n) {
    g = n;
    sort(strings.begin(), strings.end(), compare)
    
    return answer;
}

string stream 이용하기

  • 오픈채팅방(프로그래머스)
#include <string>
#include <vector>
#include <sstream>
#include <map>
using namespace std;

vector<string> solution(vector<string> record) {
	vector <string> answer;
	vector <string> uid; //record에서 아이디만 따로 저장
	map <string, string> nick_Info; //key:아이디 / value:닉네임
	stringstream ss; string action; string id; string nickname;
	for (int i = 0; i < record.size(); i++) {
		ss.str(record[i]);
		ss >> action; //Enter, Leave, Change
		if (action == "Enter") {
			ss >> id;
			ss >> nickname;
			answer.push_back("님이 들어왔습니다.");
			uid.push_back(id);
			nick_Info[id] = nickname;
		}
		else if (action == "Leave") {
			ss >> id;
			answer.push_back("님이 나갔습니다.");
			uid.push_back(id);
		}
		else {
			ss >> id;
			ss >> nickname;
			nick_Info[id] = nickname;
		}
		ss.clear();
	}
	for (int i = 0; i < answer.size(); i++) {
		answer[i] = nick_Info[uid[i]] + answer[i]; //아이디에 해당하는 닉네임을 붙여줌
	}
	return answer;
}

알파벳 대소문자 확인

  • tolower, toupper 사용

  • 대소문자 구분 X

    • strcasecmp 함수를 사용
          string text1 = "Hey! Mr. Tambourine man, play a song for me";
          string text2 = "hey! Mr. Tambourine man, PLAY a song for me";
          string text3 = "Hey! Mrs. Tambourine man, play a song for me";
    
          if (strcasecmp(text1.c_str(), text2.c_str()) == 0) {
              cout << "strings: text1 and text2 match." << endl; //결과 출력
          } else {
              cout << "strings: text1 and text2 don't match!" << endl;
          }
    

공백이 포함된 문자열 입력

  • getline(cin, str) 이용!

  • 문서검색(백준) - 1543

#include <vector>
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

int main(){
    string s;
    string t;
    int cnt = 0;
    getline(cin, s);
    getline(cin, t);

    while(s.find(t) != -1){
        int index = s.find(t);
        s = s.substr(index + t.size());
        cnt++;
    }

    cout << cnt << '\n';
    
}


Algorithm Share Tweet +1