c++ 중간고사를 준비하다가 String을 조작하는 함수들에 대해 한 번 정리할 필요가 있을 것 같아서 정리해보았다.
str 을 문자열이라고 할때,
- str.substr(a) , str.substr(a,b)
- substr(a) : str의 a길이 만큼의 문자열은 건너뛰고 그 뒤에서부터 반환
- substr(a,b) : str의 인덱스 4부터 12길이 만큼의 문자열 반환
- strtok(str, ", ")
- strtok 함수는 처음 Call할 때만 원하는 문자열을 집어넣고, 다음 부터는 인자에 NULL을 넣어준다. strtok함수가 NULL을 반환할 때까지 계속 불러줘야함.
예시 코드는 아래와 같다
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str[] = "July 15, 2019";
char* p;
p = strtok(str, ", ");//first call
while (p !=NULL)
{
cout << p << endl;
p = strtok(0, ", ");
}
return 0;
}
- strstr(Str, "string")
- string 문자열이 시작하는 부분의 주소값을 반환
- string 문자열 전체를 반환하려면 아래와 같은 코드를 짜야된다.
예시코드는 아래와 같다.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str[] = "Hello friends of mine!";
char* sPtr = strstr(str, "friends");
cout << "The substring starts at index : " << sPtr- str<< endl;
return 0;
}
- strcmp(s,t) , strncmp(s,t , i)
- strcmp(s,t) : 문자열 s와 문자열 t의 아스키코드 값을 비교하여 s > t 이면 1, s == t 이면 0 , s < t 이면 -1 을 반환
- strcmp(s,t) : 문자열 s 와 문자열 t의 아스키코드 값을 비교하는데 i는 처음부터 비교할 문자열의 길이이다. 반환값은 strcmp(s,t) 와 같다. (** i는 unsigned int이기 때문에 0값이 들어갈 수 없다.)
예시 코드는 아래와 같다
#include <iostream>
#include <cstring>
using namespace std;
void print(char* s, char* t)
{
int result = strcmp(s, t);
if (result == 0)
cout << "Strings are same." << endl;
else
{
int i = 1;
for (i; i <= strlen(s); i++)
{
int result2 = strncmp(s, t, i);//i는 비교할 문자열의 길이
if (result2 != 0)
break;
}
cout << "Strings are not same." << endl;
cout << "But until index " << i-1 << ", two strings are same." << endl;
}
}
int main() {
char str1[] = "This is the string.";
char str2[] = "This is the string.";
char str3[] = "This aa also string";
print(str1, str2);
print(str1, str3);
return 0;
}
- strchr(str, 'e') , strrchr(str, 'e')
- strchr(str,'e') : str문자열 중에 forward search로 'e'문자가 있는지 검사후, 있으면 해당 문자를 첫 번째로 찾은 주소값을 반환
- strrchr(str,'e') : str문자열 중에 backward search로 'e'문자가 있는지 검사후, 있으면, 해당 문자를 첫 번째로 찾은 주소값을 반환
- str.find('c') , str.rfind('c')
- str.find('c') : str 문자열 중에 'c' 문자열이 있는지의 여부를 검사하여 있으면, 인덱스를 반환하고 존재하지 않으면 -1을 반환한다. 없는 경우에 str.find('c') == -1 혹은 str.find('c') == str::npos 로 코드를 작성할 수 있다.
- find_first_of(string), find_not_first_of(string)
- 코드의 주석부분에 관련 설명을 썼다.
- 코드는 아래와 같다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string text, word;
string delimiter(" \n");
int wStart, wEnd;
int npos;
cout << "Enter a line of text : " << endl;
getline(cin, text);
cout << "Words in the text : " << endl;
wStart = text.find_first_not_of(delimiter,0);//delimiter문자열의 구성 문자들 중 하나가 없는 문자의 인덱스를 0인덱스부터 forward search로 찾아서 반환
npos = text.length();//text문자열의 길이 반환
while (wStart < npos)
{
wEnd = text.find_first_of(delimiter, wStart);//delimiter문자열의 구성 문자들 중 하나가 있는 문자의 인덱스를 wStart 인덱스부터 forward search로 찾아서 반환
cout << text.substr(wStart, wEnd - wStart) << endl;//wStart인덱스부터 WEnd-WStart 길이 만큼의 문자열을 반환
wStart = text.find_first_not_of(delimiter, wEnd);//delimiter문자열의 구성 문자들 중 하나가 없는 문자의 인덱스를 wEnd 인덱스부터 반환
}
return 0;
}
- str.compare(pos1, n1, str2, pos2, n2)
- str.compare(pos1, n1, str2, pos2, n2) : str 문자열에서 pos1 인덱스부터 n1길이부분과 str2 문자열에서 pos2 인덱스부터 n2길이부분의 아스키코드 값을 비교하여 정수형 반환
- str.compare(pos1, n1, str2, n2) : str 문자열에서 pos2 인덱스부터 n1길이부분과 str2 문자열에서 처음 인덱스부터 n2길이 부분의 아스키코드 값을 비교하여 정수형 반환
- str.append(temp) : str문자열의 뒤 부분에 temp문자열을 붙임
- str.insert(pos1, temp) : str문자열의 pos1 인덱스 부분에 temp문자열을 집어넣음
- str.replace(pos1, n1, temp ) :
- pos1 : 바꿀 문자열 시작 위치
- n1 : 길이
- temp : 치환할 문자열
'2023 1학기 > c++' 카테고리의 다른 글
[c++] tokenizer 간단 구현 (0) | 2023.04.15 |
---|---|
[c++] virtual 함수가 필요한 이유 (0) | 2023.04.15 |
[c++] Class Relationships : association, aggregation (0) | 2023.04.08 |
[c++]파일 입출력 c++ fstream, ofstream 사용 (0) | 2023.03.26 |
[c++] #ifndef #define #endif #pragma once (0) | 2023.03.26 |