Использование и взаимное преобразование строк в C++/C

глубокое обучение

Один, струна C

\

В языке C нет строкового типа данных, вы можете использовать массив символов, оканчивающийся символом NULL ('\0'), для хранения строк. \

Только массивы символов, оканчивающиеся нулевым символом, являются строками C, в противном случае это просто обычные массивы символов C.

\

Связанные функции находятся в заголовочном файле

Примечание:
— это C-версия файла заголовка, который содержит функции обработки строк, такие как strcpy().


До стандартизации C++ (1998 г.) все эти файлы были заново определены для совместимости и добавлены в стандартную библиотеку.После добавления имени файла был добавлен префикс "c", а суффикс .h был удален. поэтому заголовочный файл string.h становится заголовочным файлом cstring.


— это заголовочный файл, определенный стандартом C++, который определяет строковый класс строки и включает в себя различные операции строкового класса. Он также включает строковые операции старой версии C.

\

1. Используйтемассив символовC может использоваться, когда строка памяти определяет, что "=" инициализируется, но тогда нельзя использовать "=" C, а затем присваивать строку. Переназначение доступного strcpy(). \

Также доступно в Cуказатель символаЧтобы получить доступ к строке, указатель символа указывает на адрес первого элемента массива строк для доступа.

Обратите внимание на следующие примеры примечаний:

\

char a[11] = "kobe";//字符串的初始化
	//a="kobebryant"不能如此赋值!!
	strcpy(a,"kobecryant");//字符串的赋值
	a[4]='b';

	//获取字符串的长度,不包括'\0'在内
	int n=strlen(a);
	printf("%s\n",a);
	
	char *b = "kobe mvp!";
	b="kobe 24mvp!!";//指针可以这样赋值!!
	//b[7]='g';错误!
    printf("%s\n",b);

\

2. Некоторые распространенные варианты использования функций:

#include<stdio.h>
#include<string.h>
int main(){
	char s1[]="kobe is FMVP";
	char s2[20]="num.24";
	char s3[]="num.08";
	char s4[20],*p;
	printf("s1现在是:%s\n",s1);
	printf("s2现在是:%s\n",s2);
	printf("s3现在是:%s\n",s3);
	printf("s4现在是:%s\n\n",s4);
//	int strlen(char *str)
	printf("s1长度:%d\ts2长度:%d\n\n",strlen(s1),strlen(s2));
	
//串拷贝 char *strcpy(char *str1,char *str2)
	strcpy(s4,s2);  
	printf("s2赋值s4后:%s\n\n",s4);
	
//串连接 char *strcat(char *str1,char*str2)
	printf("s1接在s2后:%s\n\n",strcat(s2,s1));
//注意:如果使用字符数组存放字符串,strcat函数并不检查第一个数组是否能够容纳第二个字符串,
//这样多出来的字符串就会溢出到相邻的存储单元而出现问题。
   
//串比较 int strcmp(char *str1,char *str)  //比较的是对应字符的ASCII码值,如果str1>str2,返回1
	printf("%d\t%d\t%d\n\n",strcmp(s2,s3),strcmp(s2,s2),strcmp(s3,s2));
	
//串定位char *strchr(char *str,char ch)
	p=strchr(s1,'M'); //找到返回字符在字串中的位置,否则返回-1
	strcpy(p,s2);
	printf("找到s1的第一次出现'M'的位置,把s2接上后:%s\n",s1);

	return 0;
}


Результат вышеуказанной операции:

\

\

Во-вторых, строки C++

\

Строка не является базовым типом самого языка C++, это строковый класс, объявленный в стандартной библиотеке C++, который можно использовать для определения объектов. Каждая строковая переменная является объектом класса string. Чтобы использовать строковый тип, мы должны включить заголовок

\

1. Декларация и инициализация

string Str;
Приведенное выше объявление не передает параметры, поэтому конструктор строки по умолчанию используется напрямую.Что делает эта функция, так это инициализирует Str пустой строкой.

Конструктор и деструктор класса String выглядят следующим образом:
string s1
string s2(s1) 
string s2=s1
string s3("value") 
string s3="value"
string s(num,'c') // Генерируем строку, содержащую num c символов


2. Вход
(1) Метод 1:

cin>>s;

cout<<s<<endl;

Пробелы будут игнорироваться, считываться от непробелов до конца пробелов, пробелы относятся к пробелам, новым строкам, табуляциям и т. д.


(2) Метод 2:

Используйте функцию getline для сохранения пробелов до тех пор, пока при каждом чтении строки не будет встречаться символ новой строки.
Например:\

#include<iostream>
#include<string>
int main(){
	std::string line;
	while(getline(std::cin,line))
		std::cout<<"input: "<<line<<std::endl;
	return 0;
}


\

3. Функции работы с объектом (разобраны онлайн, но не полностью протестированы)


Случайное чтение:

const char &operator[](int n)const;
const char &at(int n)const;
char &operator[](int n);
char &at(int n);

#include<iostream>
#include<string>
using namespace std;
int main(){
	string s="kobe bryant",s2;
	cout<<s.operator[](2)<<endl;
	cout<<s.at(2)<<endl;
	cout<<s[2]<<endl;
//	cout<<s.at(20)<<endl;
	cout<<s.operator[](20)<<endl;
	return 0;
}

\

И оператор [] и at() возвращают символ в n-й позиции в текущей строке, но функция at обеспечивает проверку диапазона и выдает исключение out_of_range при выходе за границы, а оператор нижнего индекса [] не предоставляет доступ для проверки.



Атрибуты:

int capacity()const; // Возвращаем текущую емкость (то есть количество элементов в строке, которые можно сохранить без увеличения памяти)
int max_size()const; // Возвращаем максимальную длину строки, которую можно сохранить в строковом объекте
int size()const; // Возвращаем размер текущей строки
int length()const; //возвращаем длину текущей строки
bool empty()const; // является ли текущая строка пустой
void resize(int len,char c);//Установите текущий размер строки равным len и заполните недостающую часть символом c


Назначение:
string &operator=(const string &s);//Присвоить строку s текущей строке
string &assign(const char *s);//Назначить с типом c string s
string &assign(const char *s,int n);//Назначить n символов, начиная со строки c s
string &assign(const string &s);//Присвоить строку s текущей строке
string &assign(int n,char c);//Назначить n символов c текущей строке
string &assign(const string &s,int start,int n);//Назначить n символов, начиная с start в строке s, текущей строке
string &assign(const_iterator first,const_itertor last);//Назначаем часть между первым и последним итераторами строке


Объединение:
string &operator+=(const string &s);//Соединяем строку s с концом текущей строки
string &append(const char *s); // Соединяем строку s типа c с концом текущей строки
string &append(const char *s,int n);//Соединяем первые n символов строки c-типа s с концом текущей строки
String & Append (Const String & s); // То же, что и оператор + = ()
String & Append (const string & s, int n); // Соединяем N символов из POS S с концом текущей строки из POS S
string &append(int n,char c); //Добавить n символов c в конец текущей строки
string &append(const_iterator first,const_iterator last);//Соединяем часть между итератором first и last с концом текущей строки


сравнивать:
bool operator==(const string &s1,const string &s2)const;//Сравнить две строки на равенство
Операторы ">", "=","int compare(const string &s) const;//Сравниваем размер текущей строки и s
INT Compare (int POS, INT N, Const String & S) const; // Сравнивает текущую строку из N символов, начиная с POS и размером S
int compare(int pos, int n,const string &s,int pos2,int n2)const;//Сравнить строку, состоящую из n символов, начиная с pos, с символом, состоящим из n2 символов, начиная с pos2, в размере строки s
int compare(const char *s) const;
int compare(int pos, int n,const char *s) const;
int compare(int pos, int n,const char *s, int pos2) const;
Функция сравнения возвращает 1 при >, -1 при

Подстрока:
string substr(int pos = 0,int n = npos) const;//Возвращает строку из n символов, начиная с pos

обмен:
void swap(string &s2); // поменять местами текущую строку и значение s2


Находить:
int find(char c, int pos = 0) const;//Начнем с pos, чтобы найти позицию символа c в текущей строке
int find(const char *s, int pos = 0) const;//Начнем с pos, чтобы найти позицию строки s в текущей строке
int find(const char *s, int pos, int n) const;//Начнем с pos, чтобы найти позицию первых n символов в строке s в текущей строке
int find(const string &s, int pos = 0) const;//Начнем с pos, чтобы найти позицию строки s в текущей строке
//Вернуть местоположение, если поиск увенчался успехом, и вернуть значение string::npos, если поиск не удался
int rfind(char c, int pos = npos) const;//Начнем с pos и ищем позицию символа c в текущей строке сзади вперед
int rfind(const char *s, int pos = npos) const;
int rfind(const char *s, int pos, int n = npos) const;
int rfind(const string &s,int pos = npos) const;
// начать с pos, чтобы найти положение строки, состоящей из первых n символов в строке s в текущей строке сзади к фронту, успешно верните позицию и верните значение String :: NPOS, когда он не удается
int find_first_of(char c, int pos = 0) const;//Начнем с pos, чтобы найти первое вхождение символа c
int find_first_of(const char *s, int pos = 0) const;
int find_first_of(const char *s, int pos, int n) const;
int find_first_of(const string &s,int pos = 0) const;
//Начнем с pos, чтобы найти позицию первого символа в массиве, состоящем из первых n символов s в текущей строке. Если поиск не удался, вернуть string::npos
int find_first_not_of(char c, int pos = 0) const;
int find_first_not_of(const char *s, int pos = 0) const;
int find_first_not_of(const char *s, int pos,int n) const;
int find_first_not_of(const string &s,int pos = 0) const;
//Находим позицию первого символа, которого нет в строке s из текущей строки, если не получается, возвращаем string::npos
int find_last_of(char c, int pos = npos) const;
int find_last_of(const char *s, int pos = npos) const;
int find_last_of(const char *s, int pos, int n = npos) const;
int find_last_of(const string &s,int pos = npos) const; 
int find_last_not_of(char c, int pos = npos) const;
int find_last_not_of(const char *s, int pos = npos) const;
int find_last_not_of(const char *s, int pos, int n) const;
int find_last_not_of(const string &s,int pos = npos) const;
//find_last_of и find_last_not_of аналогичны find_first_of и find_first_not_of, но смотрят снизу вверх


заменять:
string &replace(int p0, int n0,const char *s);//удалить n0 символов, начиная с p0, затем вставить строку s в p0
string &replace(int p0, int n0,const char *s, int n);//удалить n0 символов, начиная с p0, затем вставить первые n символов строки s в p0
string &replace(int p0, int n0,const string &s);//удалить n0 символов, начиная с p0, затем вставить строку s в p0
string &replace(int p0, int n0,const string &s, int pos, int n);//удалить n0 символов, начиная с p0, затем вставить n символов, начиная с pos, в строку s в точке p0
string &replace(int p0, int n0,int n, char c);//удалить n0 символов, начиная с p0, затем вставить n символов c в p0
string &replace(iterator first0, iterator last0,const char *s);//Заменяем часть между [first0, last0) строкой s
string &replace(iterator first0, iterator last0, const char *s, int n);//Заменяем часть между [first0, last0) первыми n символами s
string &replace(iterator first0, iterator last0,const string &s);//Заменить часть между [first0, last0) строкой s
string &replace(iterator first0, iterator last0,int n, char c);//Заменить часть между [first0, last0) n символами c
string &replace(iterator first0, iterator last0, const_iterator first, const_iterator last);//Заменяем часть между [first0, last0] строкой между [first, last)


Вставлять:
string &insert(int p0, const char *s);
string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
// Первые 4 функции вставляют первые n символов, начиная с pos, в строку s в позиции p0

string &insert(int p0, int n, char c);//Эта функция вставляет n символов c в позицию p0
iterator insert(iterator it, char c);//Вставляем в него символ c, возвращаем позицию итератора после вставки
void insert(iterator it, const_iterator first, const_iterator last);//Вставить символы между [first, last] в нем
void insert(iterator it, int n, char c);//Вставляем в него n символов c


Удалить:
iterator erase(iterator first, iterator last);//Удалить все символы между [first, last], вернуть позицию итератора после удаления
iterator erase(iterator it);//Удаляем символ, на который он указывает, и возвращаем позицию итератора после удаления
string &erase(int pos = 0, int n = npos);//удалить n символов, начиная с pos, и вернуть измененную строку
\

\

В-третьих, преобразование между C и C++

\

1. Ключ:

const char *data()const;//Возвращает ненулевой массив из c символов в конце
const char *c_str()const;//Возвращает строку c, заканчивающуюся нулем\

int copy(char *s, int n, int pos = 0) const;//Скопировать n символов, начинающихся с pos в текущей строке, в массив символов, начинающийся с s, и вернуть фактическое количество копий\

\

2.string-> const char *

Два метода:

string s1="kobebryant";
	const char *a=s1.c_str();
	const char *b=s1.c_str();
	cout<<a<<endl;
	cout<<b<<endl;


3. string-> char *

#include<iostream>
#include<malloc.h>
#include<string>
using namespace std;
int main(){
	string s1="kobebryant 123";
	char *c;
	int len=s1.length();
	c=(char*)malloc((len)*sizeof(char));
	s1.copy(c,len,0);
	cout<<c<<endl;
	
}


\

4. char *->string

string s;
	char *p="kobe mvp!";
	s=p;
	cout<<s<<endl;


\

5. char[ ]->string

string s;
	char p[10]="kobe mvp!";
	s=p;
	cout<<s<<endl;


6. string->char[ ]

string s = "kobe bryant";
    char a[12];
    for( int i=0;i<s.length();i++)
        a[i] = s[i];
    a[i] = '\0';
    printf("%s\n",a);


\

\

\

\

\

\

\

\