String npos c что это
Перейти к содержимому

String npos c что это

  • автор:

String npos c что это

Стандартная библиотека языка С++ предоставляет программистам строковый тип данных (избавляет от использования массивов символов char[ ]).

Мы будем использовать тип данных string наряду со стандартными встроенными типами данных. И вы на первый взгляд не будете замечать никаких различий, хотя на самом деле это абстрактный тип данных, созданный на основе объектно-ориентированных возможностей языка С++. Надеюсь со временем вы тоже сможете создавать АТД, которыми можно будет пользоваться так же удобно и свободно, как и классом string.

Строковый тип данных позволяет хранить строки переменной длины, причем длину можно менять в процессе выполнения программы. Строковый тип представляет операторы, выполняющие такие операции над строками, как контеканация, присваивание, замещение и др.

Для того, чтобы можно было создавать строковую переменную, необходимо подключить описание этого типа данных из стандартной библиотеки.

void main()
string name=»Vitaly»; // объявление, определение, инициализация
string lastname=»Domnenko»;

name+=»M.»+lastname; // конкатенация с присваиванием (накапливающее присваивание)
cout >

Используя [ ] можно получить символ из любой позиции

char ch=name[5]; // символы нумеруются с нуля

Лексикографическое сравнение осуществляется с использованием операторов == < >= !=. При лексикографическом сравнении последовательно сравниваются коды символов строки. Те символы считаются «больше», чьи коды «больше»и наоборот.

Кодировка (кодовая таблица) — это однозначное соответствие между целым число (кодом) и символом. При этом символ — это буква, цифра и другие графические знаки. Кодировки обычно составляют так, что символы следуют в алфавитном порядке и символ ‘а’ имеет наименьший код, а символ ‘z’ наибольший. Таким образом, выполняя лексикографическое сравнение можно разместить слова (строки) в алфавитном порядке. Это справедливо и для символов кириллического алфавита. Но не всегда, т.к. существует кодировки, в которой кириллические символы располагаются не в алфавитном порядке. Это кодировка КОИ8, которая обычно используется в операционных системах UNIX. Если вы пишете программу для UNIX, то нужно помнить, что простое лексикографическое сравнение не даст ожидаемого результата и нужно усложнять программу.

В нашем случае (при программировании для DOS или Windows) используются кодировки CP866 и СP1251 лексикографическое сравнение справедливо и дает нужный результат.

Ну и операторы для ввода/вывода строковых переменных >>

Функция Описание
Конструкторы
string() конструктор по умолчанию, создает пустую строку
string(const char* p) преобразующий конструктор
string(const string& str, size t pos=0, size t n=npos) копирующий конструктор (npos обычно равен -1 и указывает, что память не была выделена)
string(const char* p, size_t n) копирует n символов, р является базовым адресом
string(char c, size t n=l) создает строку из n символов с
Перегруженные операторы
string& operator= (const string& s) оператор присваивания
string& operator+= (const string& s) добавляет строку
char operator[] (size t pos) const возвращает символ из позиции pos
char& operator[] (size t pos) возвращает ссылку на символ из позиции pos
Функции-члены
string& append(const string& s, size_t pos=0, size t n=npos); Добавляет n символов начиная от позиции pos
string& assign(const string& s, size_t pos=0, size_t n=npos); строковому объекту присваивается n символов, начиная от позиции pos
string& insert(size_t posl, const string& str, size_t pos2=0 , size_t n=npos); вставляет n символов, полученных из str, начиная с позиции pos2, в строку с позиции posl
string& remove(size_t pos=0 , size_t n=npos); Удаляются n символов из строки начиная с позиции pos
string& replace(posl, nl, str, pos2=0, n2=npos); в неявной строке начиная с позиции posl заменяет nl символов n2 символами из подстроки str с позиции pos2
string& replace(pos, n, p, n2); заменяет n символов в позиции pos используя char* p из n2 символов или char* p до завершающего нуля, или повторяя символ с rep раз
char get_at (pos) const; возвращает символ из позиции pos
void put_at (pos, c); помещает символ с в позицию pos
size_t length() const; возвращает длину строки
const char* c_str() const; преобразует строку в традиционное char* представление
const char* data() const; возвращает базовый адрес строкового представления
void resize(n, c); void resize(n); изменяет строку, делая ее длину равной п; в первой функции в качестве заполняющего символа выступает с, а во второй — символ eos () (end-of-string, конец строки)
void reserve(size_t res_arg);size_t reserve() const; выделяет память под строку; первая функция переустанавливает this; вторая возвращает закрытый член res — размер выделенного фрагмента
size_t copy(p, n, pos=0) const; п симолов строки, начиная с позиции pos, копируются в char* p
string substr(pos=0, n=pos) const; возвращается подстрока из п символов строки
int compare(const string& str, size_t pos=0, size_t n=npos) const; сравнивает п символов строки, начиная с позиции pos, со строкой str. Возвращается ноль, если строки равны; в противном случае возвращается положительное или отрицательное целое значение, показывающее, что неявная строка лексикографически больше или меньше чем строка str.
size_t find (const string& str, size_t pos=0) const; в строке начиная с позиции pos производится поиск строки str. Если она найдена, возвращается позиция, в которой она начинается; в противном случае возвращается позиция npos
size_t rfind(str, pos=npos) const; похоже на find (), но при поиске первого совпадения строка сканируется в обратном направлении
size_t find_first_of(str, pos=0) const; производится поиск первого вхождения str начиная с позиции pos
size_t find_last_of(str, pos=npos) const; аналогично, но в обратном направлении
size_t find_first_not_of(str, pos=0) const; производится поиск первого символа, который не соответствует ни одному из символов str начиная с позиции pos
size_t find_last_not_of(str, pos=npos) const; аналогично, но в обратном направлении
Пример работы со строками
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 2.1. Пример работы со сроками // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include // подключение библиотеки ввода-вывода #include // подключение библиотеки ввода-вывода в файл #include // подключение описания string using namespace std; // подключение стандартного пространства имен для использования библиотек ///////////////////////////////////////////////////////////////////////////// void main() < ifstream ifile("test.html"); // создание потока ввода из файла по его имени string data; // строка куда будут записаны данные // цикл будет выполняться до тех пор, пока не встретиться конец файла while(!ifile.eof()) < string sLine; getline(ifile, sLine, '\n'); // читаем строку из файла до символа конца строки data+=sLine; // записываем прочитанную строку в конец итоговой > size_t num_first=0; // номер символа, с которого будет происходить поиск // бесконечный цикл, выход из цикла - по оператору break while(true) < // находим номер символа, с которого начинается подстрока " // если такого текста не нашли - выход из цикла num_first=data.find(", num_first); if(num_first==string::npos) break; // находим номер символа, с которого начинается подстрока ">", начиная с символа под номером num_first+1 // если такого текста не нашли - выход из цикла size_t num_last=data.find(">", num_first+1); if(num_last==string::npos) break; // выделяем подстроку от "" string image_data=data.substr(num_first+1, num_last-num_first-1); // запоминаем символ, начиная с которого будем искать в следующий раз num_first=num_last+1; // ищем номер символа, с которого начинается подстрока "src="" // (для задания подстроки используем экранирующий символ) size_t num_first2=image_data.find("src=\""); // если такая подстрока была найдена if(num_first2!=string::npos) < // ищем закрывающую кавычку size_t num_last2=image_data.find("\"", num_first2+6); // если такая подстрока была найдена - выделяем в отдельную строку имя файла и выводим на экран if(num_last2!=string::npos) < string image_name=image_data.substr(num_first2+5, num_last2-num_first2-5); cout> >; > ///////////////////////////////////////////////////////////////////////////// 

String npos c что это

в справочнике написанно что если не найдет ничего вернёт npos, сравниваю, но компилятор говорит что нужен int а не чар для сравнения с этой функцией, что делать?

Re: что такое npos?

От: Smal
Дата: 12.03.07 16:37
Оценка:

Здравствуйте, Ruweb, Вы писали:

R>Всем привет,
R>

R>if(post.find("proxy_type", 0) == npos) R>

R>в справочнике написанно что если не найдет ничего вернёт npos, сравниваю, но компилятор говорит что нужен int а не чар для сравнения с этой функцией, что делать?

std::string::npos это (size_t)-1 (обычно )

С уважением, Александр
Re[2]: что такое npos?

От: Smal
Дата: 12.03.07 16:44
Оценка:

Здравствуйте, Smal, Вы писали:

S>Здравствуйте, Ruweb, Вы писали:

R>>

R>>if(post.find("proxy_type", 0) == std::string::npos) R>>

С уважением, Александр
Re: что такое npos?

От: Андрей Коростелев http://www.korostelev.net/
Дата: 12.03.07 17:58
Оценка:

Здравствуйте, Ruweb, Вы писали:

R>в справочнике написанно что если не найдет ничего вернёт npos, сравниваю, но компилятор говорит что нужен int а не чар для сравнения с этой функцией, что делать?

Автор: Ruweb
Дата: 11.03.07
Автор: Ruweb
Дата: 11.03.07
Автор: Ruweb
Дата: 11.03.07
Re[2]: что такое npos?

От: Аноним
Дата: 12.03.07 19:40
Оценка: 1 (1) +1

Здравствуйте, Андрей Коростелев, Вы писали:

АК>Слушай, парень, ты прикалываешься или серьезно?

Да не прикалывается он.
Он еще молодой и зеленый, а потому и каша в голове.
Все придет в норму, если будет дальше ковырять и ему есть с кем общаться
из тех, кто уже с лысиной и умудрен опытом

std::basic_string::npos

Это специальное значение, равное максимальному значению, представляемому типом size_type . Точное значение зависит от контекста, но обычно он используется либо как индикатор конца строки функциями, которые ожидают строковый индекс, либо как индикатор ошибки функциями, которые возвращают строковый индекс.

Note

Хотя в определении используется -1 , size_type является целым числом без знака, а значение npos является максимальным положительным значением, которое оно может содержать, из-за signed-to-unsigned implicit conversion . Это переносимый способ указать наибольшее значение любого беззнакового типа.

Example

#include #include #include int main() < // функции поиска строк возвращают npos, если ничего не найдено std::string s = "test"; if (s.find('a') == std::string::npos) std::cout "no 'a' in 'test'\n"; // функции, принимающие подмножества строк в качестве аргументов // используем npos как индикатор "всего пути до конца" std::string s2(s, 2, std::string::npos); std::cout << s2 '\n'; std::bitset b("aaabb", std::string::npos, 'a', 'b'); std::cout << b '\n'; >
no 'a' in 'test' st 00011

Объясните что такое npos?

inline-объясните что такое
1.Перегрузка ф-ии-следует ли все функции перегрузить? 2.inline-объясните что такое 3.каким.

Объясните пожалуйста что такое многофайловый проект
Объясните пожалуйста что такое многофайловый проект. Гуглила, толком ничего не нашла. Есть вот.

Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
а что такое s? Инстанс std::string?
Регистрация: 10.12.2013
Сообщений: 29
s — это строка
59 / 59 / 33
Регистрация: 08.03.2014
Сообщений: 138
npos — это какбы несуществующая позиция, например find может вернуть npos, если ничего не найдет

if(str.find("something", 0) == npos)

Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

ЦитатаСообщение от isergeym Посмотреть сообщение

s — это строка
Регистрация: 10.12.2013
Сообщений: 29
ну вот у меня например в коде считаю сколько раз одна строка входит в другую

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
string S1,S2; cout"Vvedite stroku1:"endl; cin>>S1; cout"Vvedite stroku2:"endl; cin>>S2; int len=s.length(); int l=len; int n=0; int P=0; while( (P=S1.find(S2,P))!=S1.npos ){ n++; P++; } coutnendl; }

Добавлено через 8 минут

Добавлено через 1 минуту

ЦитатаСообщение от you_rule Посмотреть сообщение

npos — это какбы несуществующая позиция, например find может вернуть npos, если ничего не найдет

if(str.find("something", 0) == npos)

т.е. npos это какая т максимальная или очень большая позиция строки?
59 / 59 / 33
Регистрация: 08.03.2014
Сообщений: 138
isergeym, скорее -1
Регистрация: 10.12.2013
Сообщений: 29
чот я в конец запутался
Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

ЦитатаСообщение от isergeym Посмотреть сообщение

т.е. npos это какая т максимальная или очень большая позиция строки?

ЦитатаСообщение от isergeym Посмотреть сообщение

чот я в конец запутался

а что тут путаться, npos определена пока как size_t, а значит чтобы задать ей максимальное значение, можно просто написать -1(в бинарном виде -1 — это все единички, а значит в без знаковом представлении — максимально возможное значение)

Регистрация: 16.01.2020
Сообщений: 1
А объясните, пожалуйста, почему -1 в двоичной системе представляет собой все единицы?
Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

Mihail2003, всё зависит от способа представления чисел.
В Вашем случае советую почитать о дополнительном коде.
https://ru.m.wikipedia.org/wik. 0%BE%D0%B4

Эксперт CЭксперт С++

11126 / 6084 / 1663
Регистрация: 18.10.2014
Сообщений: 15,294

ЦитатаСообщение от Mihail2003 Посмотреть сообщение

А объясните, пожалуйста, почему -1 в двоичной системе представляет собой все единицы?

Выше речь шла не просто о некоем абстрактном «-1 в двоичной системе», а именно о значении -1 , приведенном к беззнаковому типу size_t . Беззнаковые типы в С и С++ реализуют арифметику по модулю. Отсюда сразу следует, что -1 в беззнаковом типе будет давать максимальное значение данного типа. Ну а максимальное значение в двоичной системе счисления — это, разумеется, «все единицы».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *