Перейти к содержимому

String npos c что это

  • автор:

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

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

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

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

Как проверить, существует ли какой-нибудь определённый символ в строке?

Пожалуйста добавьте этот код в вопрос, нажав на кнопку «Править» под вопросом. А так же напишите что не так с вашим кодом.

20 мар 2021 в 16:47
Хорошо, код у вас есть. Объясните, что с ним не так. Он не работает?
20 мар 2021 в 16:48

Может и есть другие способы, но это самый лучший (по крайней мере лично я лучше не знаю) способ. Но вы пишите if((stroka.find(‘@’)) < 20) это условие будет возвращать true когда индекс первого вхождения '@' будет < 20. Функция find() возвращает string::npos если символ в строке не найден, иначе возвращает индекс первого вхождения переданного в него символа. if(stroka.find('@') != string::npos) будет правильней писать.

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 необходимо включить в заголовок программы описание:

Также во всех примерах предполагается, что в начале программы подключено пространство имен std:
using namespace std;
Описание строки полностью аналогично описанию любой другой переменной. Например:
string example_str;

  • Присваивание
  • Сравнение
  • Ввод
  • Запрос длины строки (size, length)
  • Соединение (+)
  • Удаление фрагмента (erase)
  • Вставка фрагмента (insert)
  • Копирование фрагмента (substr)
  • Поиск фрагмента (find)
  • Преобразование к числу (sscanf, sstream)
  • Преобразование числа к строке (sprintf, sstream)
  • Строка как массив символов
  • Примечание(*)

Присваивание строк

Примеры с комментариями:

string example_str = «Do bats eat cats?»; // присваивание при описании example_str = «»; // присваивание пустой строки — // две кавычки рядом, без пробелов work_str = example_str; // присваивание между строками

Помимо этого возможно вот такое присваивание:

char a[50]; example_str = a;

Сравнение строк

Две строки равны друг другу, если у них одинаковые длины и символы на соответствующих местах полностью совпадают (то есть 1-й символ строки A равен 1-му символу строки B, 2-й символ строки A равен 2-му символу строки B и так далее)

Например строка «abc» равна строке «abc», но не равна строке «abcd».

Выяснение какая из строк больше выполняется посимвольно, аналогично алфавитному порядку русского языка. Если строка начинается с символа, чей код больше, что и сама строка больше. Если первые символы одинаковы, то сравниваются вторые символы по тому же правилу. Если и они одинаковы, сравниваются третьи и так далее. Если в процессе сравнения какая-то из строк закончилась, то она меньше другой.

Строку также можно сравнивать с пустой (обозначается двумя кавычками подряд, без пробелов).

while (example_str != «») < // какие-то команды >

Для ввода строк рекомендуется использовать функцию getline(). Данная функция читает строку целиком (с пробелами и прочими символами) до знака перевода строки.

getline(cin, example_str);

Длина строки

Функции size() или length() возвращают целое число — количество символов, которое сейчас находится в строке.

example_str = «Password»; int x = example_str.size(); // после этого фрагмента x = 8
example_str = «»; if (example_str.length() > 0) < // команды этого блока сейчас не выполнятся, // так как длина пустой строки равна 0 >;

Соединение строк

Операция + возвращает строку, получившуюся в результате соединения (дописывания одной строки после конца другой) одной или более строк. Строки соединяются в том порядке, как они указаны в операции.

example_str = «password»; article = «The » comment_str = «anyone can guess it.» example_str = article + example_str + » is so simple, so » + comment_str; // example_str = «The password is so simple, so anyone can guess it.»

Удаление фрагмента

Функция erase() удаляет указанный фрагмент строки (если это возможно). Первым параметром указывается начальный символ (с него начнется удаление), вторым — количество символов. Символы в строке нумеруются, начиная с 0.

example_str = «The star is so distant»; example_str.erase(3, 6); // example_str = «Theis so distant» // будет удалено слово star вместе с обоими пробелами

example_str = «The star is so distant»; example_str.erase(3, 80); // example_str = «The» // будет удалено столько символов, сколько возможно

Вставка фрагмента

С помощьью функции insert() можно добавить заданный фрагмент в любое место строки. Первым параметром функции является номер начальной позиции для фрагмента (нумерация начинается с 0), вторым — фрагмент. Функция изменяет исходную строку.

example_str = «123456»; example_str.insert(3, «+»); // теперь example_str = «123+456»

Копирование фрагмента

Функция substr() возвращает фрагмент строки (который тоже является строкой). Первым параметром указывается номер начального символа, вторым — количество. Символы нумеруются, начиная с 0. Функция не оказывает влияния на исходную строку.

example_str = «Do bats eat cats?»; new_str = example_str.substr(3, 5); // new_str = «bats » // будет скопировано слово «bats» вместе с последуюшим пробелом

example_str = «Do bats eat cats?»; new_str = example_str.substr(12, 100); // new_str = «cats?» // в строке нет 100 символов, поэтому будет скопировано сколько есть

Поиск фрагмента

С помощью функции find() можно определить, встречается ли данный фрагмент в строке. Функция возвращает специальное значение string::npos, если фрагмент не найден или номер первого (начиная слева) места, откуда начинается подобный фрагмент

example_str = «comandante@cia.dark.org»; x = example_str.find(«z»); // в этом примере x равно string::npos, // так как в строке нет ни одной буквы z

example_str = «comandante@cia.dark.org»; x = example_str.find(«a»); // в этом примере x равно 3, // символов «а» в строке несколько, но find // вернет номер только для первого слева

example_str = «comandante@cia.dark.org»; if (example_str.find(«te») != string::npos) < // команды этого блока выполнятся, так как // в строке есть фрагмент "te" >

Преобразование к числу

1. Ввод/вывод в stringstream. Требуется создать специальный поток ввода/вывода, который будет вводить или выводить данные в некоторый буффер в памяти. При этом операции будут сходны со стандартным вводом/выводом.

#include stringstream container; // создали специальный поток ввода/вывода, // который «работает» в некоторой области памяти string data = «918»; int x; container.clear(); // на случай, если в container что-то лежало, чтобы // случайно не попало в результат преобразования container > x; // достаем из потока это же число в виде int

2. Функция sscanf() (scan from string as fromatted). Данная функция также из обычного C (не C++) поэтому «умеет» работать только с символьными массивами. В грубом приближении у функции 3 параметра: символьный массив, строка формата и переменная (или переменные), куда следует поместить результаты преобразования.

#include string some_value = 825; x = sscanf(some_value.data(), «%d», &x); // в x записано число типа int, извлеченное из строки // функция data() позволяет получить символьный массив // в формате языка C (не C++), с таким же содержанием, // что и строка

Преобразование числа к строке

1. Ввод/вывод в stringstream. Требуется создать специальный поток ввода/вывода, который будет вводить или выводить данные в некоторый буффер в памяти. При этом операции будут сходны со стандартным вводом/выводом.

#include #include #include using namespace std; stringstream container; // создали специальный поток ввода/вывода, // который «работает» в некоторой области памяти string data; int x = 16; container.clear(); // объясняем потоку, что в нем нет данных // чтоб не получить при чтении то, что не клали туда сами container > data; // достаем из потока это же число в виде строки

2. sprintf() (print formatted to string). Эта функция также является функцией из стандартного C, и тоже работает только с массивами из char). Параметры (вкратце): символьный массив, куда будет выведен результат, строка формата, данные.

Подробнее про строку формата см. например, здесь.

#include #include #include int x; string s; char z[100]; x = 92; sprintf(z, «%d», x); s = z;

Строка как массив символов

Строку можно рассматривать как массив символов и применять к ней методы работы, как с массивом.

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

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