Str2 что означает
Есть несколько вопросов по работе строковых функций:
1. Функция FIND(Str1, Str2) должна бы, по идее, возвращать значение 0, если Str2 не найдена в Str1. Не возвращает, или, можно сказать, возвращает неправильно. А если Str2 = ‘.’ возвращает 1 всегда, где бы эта точка не находилась. Если искать ‘,’ и запятая есть в Str1, возвращается правильный номер в строке. Но если запятую из строки убрать, то возвращается номер позиции где запятая была. Ноль возвращать не хочет.
2. Если на строковый вход скрипта ST вместо непустой строки подать пустую строку, то скрипт не обрабатывает её. Например, можно написать внутри скрипта функцию LEN(in_string), надеясь получить длину 0, но ничего подобного не произойдёт.
Опрос объектов периодический. Почему пустые строки не обрабатываются? Замеченные особенности действительно имеют место быть или это я неправильно использую строковые функции?
SCADAMaster
29.05.2019, 09:19
У нас все корректно. Попробуйте проверить на текущей Beta версии.
29.05.2019, 10:08
У меня стояла версия 3.9.0.2484. Скачал с сайта версию 3.10.0.8093 3.10(RT32ReleaseMax)_19_02_01_23_46. В ней эти функции работают корректно. Спасибо за подсказку. А это и есть Beta версия? Или Beta лежит где-то в другом месте?
29.05.2019, 10:44
Поиск подстроки всегда возвращает первое вхождение, при отсутствии указания позиции с какой начинать поиск.
Если речь про точки, запятые и повторяющиеся данные.
Мне так кажется.
И вы собственно 1 получаете, что что-то найдено, нет ?
з.ы. не знаток ST но обычно так, если реализация самого ST на языке другого уровня.
Должно вернуть bool = true если нашел, и еще в некую переменную указать номер позиции первого вхождения.
SCADAMaster
29.05.2019, 11:00
У меня стояла версия 3.9.0.2484. Скачал с сайта версию 3.10.0.8093 3.10(RT32ReleaseMax)_19_02_01_23_46. В ней эти функции работают корректно. Спасибо за подсказку. А это и есть Beta версия? Или Beta лежит где-то в другом месте?
Beta лежит там же.
Но если работает эта, то используйте ее
29.05.2019, 11:48
[QUOTE=melky;306530]Поиск подстроки всегда возвращает первое вхождение, при отсутствии указания позиции с какой начинать поиск.
Если речь про точки, запятые и повторяющиеся данные.
Мне так кажется.
И вы собственно 1 получаете, что что-то найдено, нет ?
В функции FIND на языке ST два аргумента: FIND(строка в которой ищем, строка которую надо найти). Негде ей указать с какой позиции начать поиск. В версии Скады 3.9 FIND(строка, ‘.’) всегда возвращала 1, независимо от того, где в строке точка и есть ли она вообще. В версии 3.10 функция работает правильно. А если что-то не найдено в языке ST должно возвращаться 0.
29.05.2019, 11:54
Хм, че за странная функция на ST, а если у меня в строке 2 одинаковые записи, а мне нужна определенная ? или обработать одну, потом обработать следующую ?
29.05.2019, 13:18
Ага. Вот такая странная функция. Из описания: «FIND(STR1, STR2) означает: найти позицию в строке STR1, где впервые встречается подстрока STR2.» А дальше, если надо найти повторения, именно как Вы говорите — отрезать кусок строки с найденным включением, повторить поиск в оставшемся обрезке строки, и т. д. В принципе, элементарных строковых функций ST вполне хватает для несложной обработки строк. А для особо причудливых извращений есть C#.
29.05.2019, 13:23
Я так понимаю, если ничего не нашла, FIND=0, если что-то нашла то FIND = число, начало позиции первого вхождения?
может у вас там точка всегда на первой позиции ? 🙂
Powered by vBulletin® Version 4.2.3 Copyright © 2023 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot
Для представления текстовой информации в языке С+ + используются символы (константы), символьные переменные и строки (строковые константы) для которых в языке С+ + не введено отдельного типа в отличии от некоторых других языков программирования.
Строки в языке С+ + — это последовательность символов, заключенная в кавычки. Строка — это массив символов, т.е. она всегда имеет тип char.
char str [0] = «среда»;
char str [10] =
Особенность строк:
- Транслятор, размещая строку в памяти, автоматически добавляет в нее символ конец строки ‘\0’, т.е. нулевой байт. Количество элементов в таком массиве на единицу больше, чем в изображении соответствующей строковой константы. для строки «А» длина = 2 байта для символа ‘А’ длина = 1 байт
- При инициализации массива отдельными символами обязательно в конце массива указывается символ ‘\0’;
- Инициализация символьного массива пробелами char str [80] = ;
Ввод и вывод текстовой информации
Процедуры ввода — вывода символа
int ch;
ch = getch ( ); — ввод кода нажатой клавиши без отображения соответствующего символа на экране
ch = getche ( ); — ввод нажатой клавиши с соответствующего символа на экране
ch = getcrar ( ); — ввод кода нажатой клавиши вслед за нажатием клавиши enter
Вывод символа : putchar (C1)
Процедуры ввода — вывода строки: gets (str) , puts (str)
char str [80]; // объявление строки
gets (str); // ввод строки
puts (str); // вывод строки
Стандартные программные решения
- Получить символ десятичной цифры из значения переменной, лежащей в диапазоне 0…9int n;char c;c = n + ‘0′;
- Получить значение целой переменной из символа десятичной цифрыif ( c >= ‘0’ && c n = c — ‘0’;
Строки
Для работы со строками необходимо использовать заголовочный файл string.h
Функции для работы со строками
1.Определение длины строки strlen ( )
char str [ ] = «0123456789»
int l = strlen (str);
Завершающий нулевой символ в длину строки входит.
2.Копирование строк strcpy ( ), strncpy ( )
char strcpy (str1, str2)
Выполняется побайтное копирование символов из строки str2 в строку str1. Копирование прекращается только в случае достижения символа ‘\0’ (нуль- терминатор). Перед копированием необходимо проверить выполнение условия, что длина str2 меньше или равна длине str1. В противном случае возможно возникновение ошибок, связанных с наложением данных.
strcpy (str, «Проверка копирования»);
Копирование через указатели и копирование не всей строки
char str1[20] = «Проверка копирования»;
char str2[20];
char *ptr = str1;
ptr + = 9, // ptr указывает на слово «копирование»;
strcpy (str2, ptr);
cout
Функция strncpy ( ) копирует n символов из строки S2 в строку S1.
Пример: char str [40]
strncpy (str, “Borland C+ +”,7)
puts(str); // Borland
3.Конкатенация (или присоединение) строк strcat ( )
strncat ( ) – присоединение n символов из другой строки
strcat (str1, str2)
Строка str2 присоединяется к строке str1. Величина str1 должна быть достаточной для хранения объединенной строки.
Пример: char str [80];
strcpy (str, «Для продолжения»);
strcat (str, «Нажмите клавишу»);
Синтаксис: strncat (str1, str2, n)
Пример: char str [80]; = “Языки программирования”;
char str [30] = “ C+ +, Паскаль, Бейсик”;
strncat (str1, str2, 13);
puts(str1); // Языки программирования: С+ +, Паскаль
4.Сравнение строк strcmp ( )
Функция имеет тип int, так как данная функция выполняет сравнение двух строк str1 и str2, различая прописные и строчные буквы, в результате сравнения возвращает одно из следующих значений:
Если результат функции < 0, то str1 < str2.
Если результат функции = 0, то строки эквивалентны
Если результат функции > 0, то str1 > str2
Пример: str1 [ ] = «Borland»
str2 [ ] = «BORLAND»
int i;
i = strcmp (str1, str2); // i = 32
Распишем АСКИ-коды заданных строки и сравним их
Borland 66 111 114 108 97 110 100
BORLAND 66 79 82 76 65 78 68
Разница между кодами символов строк = 32, результат больше 0, значит строка str1> str2
Функция strncmp( ) проводит сравнение определенного числа первых символов двух строк. Регистр символов при этом учитывается.
char str1 [ ] = «Ошибка открытия базы»;
char str2 [ ] = «Ошибка открытия базы»;
i =strncmp (str1, str2, 12)
строки отличаются одним символом
i > 0; str1 > str2;
Функция stricmp() сравнивает строки, не различая регистра символов. Возвращается одно из следующих значений: i > 0, i = 0, i < 0;
char str1 [ ] = «Moon»; char str2 [ ] = «MOON»;
int i = strincmp (str1, str2);
i=0, строки эквивалентны
5.Преобразование строк: strlwr ( ), strupr ( ), strrev ( )
strlwr ()- преобразует прописные буквы в строчные
Пример: char str [ ] = «HELLO»;
strupr ()- преобразует строчные буквы в прописные
strrev ()- реверсирование строки, т.е. изменяет порядок следования символов на обратный.
Пример: char str [ ] = “сон”;
strrev (str); // нос
6.Поиск символов
strchr() — производит поиск символа в строке, указывает место первого вхождения символа в строку. Если символ не найден, функция возвращает NULL.
Пример: char str [ ] = «абвгдеёжзийк»;
pstr = strchr (str, ‘ж’);
В результате работы программы указатель pstr будет указывать на подстроку «жзийк» в строке str.
strrchr() — возвращает указатель на последний, совпадающий с заданным символом, символ в строке. Если символ не найден, возвращается значение NULL.
Пример: char str [ ] = «абвгджизийк»;
pstr = strrchr (str, ‘и’); // ийк
strspn() — проводит сравнение символов одной строки с символами другой и возвращает позицию (начиная с нуля), в которой строки перестают совпадать.
Функция проверяет каждый символ строки str на соответствие каждому из символов строки group. В результате работы, функция возвращает число совпавших символов.
Пример: char str [ ] = «Загрузка параметров БД»;
char substr [ ] = «Загрузка параметррррр»;
int i = strspn (str, substr);
символы совпадают до 17 позиции.
Приведенная функция различает регистр символов.
strcspn ( )— сопоставляет символы строки str1 и str2 и возвращает длину строки str1, не входящей в str2. С помощью этой функции можно определить, в какой позиции происходит перекрещение двух символьных массивов.
Пример: char str [ ] = «abcdefghijk»;
int k;
k = strcspn (str, «elf»);
k = 4 — в этой позиции строки имеют первый общий элемент.
strpbrk() — отыскивает место вхождения в строку str1 любого из символов строки str2. Если символы найдены, возвращается место первого вхождения любого символа из str2 в строку str1. В противном случае функция возвращает NULL.
Пример: char str1 [ ] = «abcdefghjk»;
char str2 [ ] = «esb»;
char *ptr;
ptr = strpbrk (str1, str2);
bcdefghjk, т.к. символ ‘b’ из строки str2 встречается в строке str1 раньше других.
7.Поиск подстрок
strstr ()- данная функция осуществляет сканирование строки str1 и находит место первого вхождения подстроки str2 в строку str1. В случае успешного поиска функция strstr() возвращает указатель на первый символ строки str, начиная с которого следует точное совпадение части str1 обязательно со всей лексемой str2. Если строка str2 не найдена в str1, возвращается NULL.
Пример: c har str1 [80] = «Производится поиск элемента»;
char str2 [80] = «Поиск»;
char *ptr;
ptr = strstr(str1, str2);
strtok() — выполняет поиск в строке str подстроки, обрамленной с обеих сторон любым символом — разделителем из строки str1.
strtok (str, str1);
В случае успешного поиска данная функция обрезает строку str, помещая символ ‘\0’ в месте, где заканчивается найденная лексема. При повторном поиске лексемы в указанной строке str первым параметром следует указывать NULL.
Пример со строками(Решение задачи можно посмотреть, скачав файл «Задача-18»):
Подсчитать сумму цифр в строке.
Типы данных
Succ — возвращает следующий символ литерного множества; Pred — возвращает предыдущий символ литерного множества; Ord — возвращает значение кода литеры; Chr — возвращает значение литеры по ее коду, является обратной по отношению к функции Ord.
Например, Succ(‘0′)=’1’ — символ, следующий за символом 0, равен символу 1. Pred(‘3′)=’2′ — символ, предшествующий символу 3, равен 2; Chr(65)=’A’ — символ, соответствующий коду 65, равен А; Ord(‘A’)=65 — код символа А равен 65.
Оглавление
- Тип данных char
- Тип данных string
- Стандартные функции для работы со строками
- Стандартные процедуры для работы со строками
Вы используете гостевой доступ (Вход)
Эта страница: General type: incourse. Context Книга: Теоретический материал (Паскаль) (context id 1486). Page type mod-book-view.
Строки и работа с символами — Введение в программирование
Сейчас вы уже знаете, что здесь происходит вызов функции, а функция console.log принимает аргумент. В данном случае аргумент — не число, а «строка». Так мы называем фрагменты текста в программировании, потому что они как последовательность букв на веревке.
Строки есть везде. Сейчас я читаю сценарий, и текстовый файл — это длинная строка. Веб-сайт, на котором вы смотрите эти видео, содержит множество слов — всё это строки. Работа Google запоминать строки — в этом суть поиска. Файлы и папки в вашем компьютере идентифицируются через их названия, которые так же являются всего лишь строками.
Так же, как мы это делали с числами, мы можем создать константу из строки:
const str = "Hello";
Вы можете использовать одиночные кавычки или двойные, не так важно, главное чтобы они были одинаковые и в начале и в конце строки.
Если вам необходимо использовать реальные кавычки внутри строки, тогда используйте другой знак для её создания. Например:
const str = 'They call him "Harry", and he likes it'; ///They call him "Harry", and he likes it
Здесь одиночные кавычки используются для формулирования или ограничения строки, и тогда у нас есть возможность поставить двойные внутри. Или наоборот:
const str = "They call him 'Harry', and he likes it"; /// They call him 'Harry', and he likes it
Двойные снаружи — одиночные внутри.
Но что делать, если такое невозможно, и вам нужно использовать одинаковый тип кавычек и для формулировки строки и внутри неё. Если вы попробуете сделать так
const str = "They call him "Harry", and he likes it";
то получите ошибку, потому что ваша строка поломана. Программа сломается в этом месте, потому что тут присутствует вторая закрывающая кавычка такого же типа, а затем идёт странное слово, которое ничего не означает, а потом новая строка. Это неправильный JavaScript.
Нам нужно объяснить интерпретатору JavaScript, что некоторые кавычки он должен воспринимать иначе. Они не должны означать «начало строки» или «конец строки», они должны означать «символ кавычек».
Это называется «экранированием». Добавьте символ экранирования, обратный слеш \ перед символом, и символ «изолируется» от своей специфической роли и превратится в обычный знак в строке.
const str = "They call him \"Harry\", and he likes it"; const str2 = 'They call her \'Ann\', and she likes it'; // They call him "Harry", and he likes it // They call her 'Ann', and she likes it
Этот символ экранирования может использоваться для включения других специальных символов в строку.
Тут есть три момента.
Первый: если нам нужен обратный слеш в строке, то он должен быть экранирован другим обратным слешем.
Второе: обратный слеш-t это не «экранируемый t-символ»: вам не нужно экранировать «t», «t» — это не специальный символ; вся конструкция обратный слеш-t — это специальная управляющая последовательность — она представляет собой единичную табуляцию, по сути — длинный пробел.
Третье: обратный слеш-n — это другая управляющая последовательность, которая представляет собой новую строчку. Считай, что вы нажмёте клавишу Enter, когда набираете текст. Поэтому, всё, что следует дальше, перейдет на новую строчку .
Теперь давайте попробуем написать функцию. Она будет принимать строку — имя и возвращать другую строку — приветствие. Вот как это должно работать:
const result = greet("Sherlock"); // "Well hello, Sherlock"
Эта функция должна уметь каким-то образом принимать входящую строку и склеивать её с другой строкой. Такой процесс называется «конкатенацией» и в JavaScript он реализуется знаком плюс, как при сложении чисел:
const greet = (str) => return "Well hello, " + str; >
Теперь другой пример. Эта функция принимает строку и возвращает ту же строку, но без каждой второй буквы. Например, «California» становится «Clfri».
const skip = (str) => let i = 0; let result = ''; while (i str.length) result = result + str[i]; i = i + 2; > return result; >
Такие квадратные скобки позволяют нам получать индивидуальные символы из строки. Как и во многих процессах в программировании, вы начинаете отсчёт с 0, а не от 1. Поэтому первый символ str это str[0] , второй — str[1] , и так далее. Это число называется «индексом».
Функция skip принимает аргумент, создаёт две переменных — i для счётчика и result для итоговой строки. Счётчик — это 0, потому что нам нужно начать с первого символа, а result это пустая строка — мы будем добавлять символы к ней один за другим.
Затем следует цикл while, с условием , что «i меньше, чем длина строки». Длина означает «сколько символов». Длина строки «cats» — 4 — в ней 4 символа, 4 буквы.
Пока счётчик меньше, чем длина, мы склеиваем или конкатенируем результирующую строку с символом по индексу i. Затем добавляем 2 к счётчику. Два, а не один, потому что нам нужно пропустить один символ.
В какой-то момент счетчик станет достаточно большим для того, чтобы условие цикла стало ложным, и функция вернёт result .
Давайте попробуем вызвать функцию с аргументом ‘cats’:
const skipped = skip('cats');
Длина ‘cats’ — 4. Несмотря на то, что индексы начинаются с 0, длина — это действительное количество. ‘c’ — не 0 букв, это одна буква. Поэтому длина ‘cats’ — 4, но индекс его последней буквы — 3.
- 0 меньше четырёх, поэтому войти в цикл while
- конкатенировать строку с символом по индексу 0 — это ‘c’
- увеличить счётчик на 2
- 2 меньше 4, поэтому повторить
- конкатенировать строку с символом по индексу 2 — это ‘t’. строка теперь стала ‘ct’
- увеличить счётчик на 2
- 4 не меньше 4, поэтому больше не повторять
- вернуть результат — ‘ct’
Вас ждут тест и практическое упражнение.
Дополнение к уроку
Неизменяемость
В JavaScript строки являются неизменяемыми, так же говорят «immutable». Это означает, что какие бы вы к ним не применяли функции, они не производят in-place замены (то есть не производят изменения самой строки). Любые строковые функции, примененные к строкам, возвращают новую строку. Это верно и в том случае, когда мы обращаемся к конкретному символу в строке.
const str = 'hello'; // toUpperCase возвращает ту же строку в верхнем регистре str.toUpperCase(); // HELLO console.log(str); // => hello str[0].toUpperCase(); // H console.log(str); // => hello str[0] = 'W'; console.log(str); // => hello
Лексикографический порядок
Лексикографический порядок — это, другими словами, алфавитный порядок. Такой порядок используется в словарях, телефонных справочниках, записных книжках и так далее.
В JavaScript вы можете сравнивать строки с помощью > и < , и сравнение будет происходить именно лексикографически.
'a' 'b' // true 'a' > 'b' // false 'abc' > 'abc' // false 'abb' > 'abc' // false 'abd' > 'abc' // true
Помните, ‘8’ это не число, а строка.
Интерполяция
Кроме одиночных » и двойных кавычек «» , современный JavaScript содержит обратные тики (backticks):
С обратными тиками вы можете использовать интерполяцию, вместо конкатенации. Вот, смотрите:
const name = "Alex"; const a = 10; const b = 12; console.log(`His name was $name> and his age was $a + b>`);
Такой код выведет на экран His name was Alex and his age was 22 . Внутрь $<> вы можете поместить любое выражение.
Интерполяция — способ соединения строк через вставку значений переменных в строку-шаблон с помощью фигурных скобок.
Интерполяция предпочтительнее конкатенации. Мы советуем не использовать конкатенацию вообще. Вот некоторые из причин:
- Такой код заставляет больше думать, потому что синтаксически + больше смахивает на сложение.
- Из-за слабой типизации можно легко получить не тот результат. Конкатенация может породить ошибки.
- Сложные строки при использовании конкатенации невозможно нормально разобрать в голове и понять, как они устроены.
Выводы
- Строка — это последовательность символов
- Пустая строка — это тоже строка (последовательность нуля символов)
- Обозначается единичными или двойными кавычками
Создание строки с константой:
const str1 = "Hello"; const str2 = 'Hello';
Возможно включить кавычку одного типа внутрь строки, окружив её кавычками другого типа:
const str1 = 'They call him "Harry", and he likes it'; const str2 = "They call him 'Harry', and he likes it";
Если в строке используются кавычки того же типа, они должны быть экранированы с помощью обратного слеша \ :
const str1 = 'They call her \'Ann\', and she likes it'; const str2 = "They call her \"Ann\", and she likes it";
Если строка включает обратный слеш (именно как символ, который хочется иметь в строке), он должен быть экранирован другим обратным слешем:
const str = "This is a backslash \\ here" // This is a backslash \ here
Также существуют управляющие символы — специальные комбинации, которые генерируют невидимые детали:
const str = "There is a tab \t and here \ncomes the new line!" // Here is a tab and here // comes the new line!
\t — это табуляция, \n это перенос на новую строку.
Конкатенация строк
Строки могут склеиваться друг с другом. Такой процесс называется конкатенацией и задаётся символом + :
const name = "Alex"; const age = 22; console.log("His name is " + name + " and his age is " + age); // His name is Alex and his age is 22
Строки будут склеены в том порядке, в котором они указаны: «mos» + «cow» → «moscow» , а «cow» + «mos» → «cowmos»
Доступ к индивидуальным символам
str[i] это i-ый символ строки str , начинающейся с 0. Например, «hexlet»[0] это h , а «hexlet»[2] это x .
Вот функция, которая принимает строку и возвращает копию этой строки без каждой второй буквы. Например, «hexlet» становится «hxe».
const skip = (str) => let i = 0; let result = ''; while (i str.length) result = result + str[i]; i = i + 2; > return result; >
str.length это длина str , то есть количество символов. Это просто количество, поэтому мы не начинаем отсчёт от 0. Например, «food».length это 4.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар « Как самостоятельно учиться »
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
