- ИТ База знаний
- Полезно
- Навигация
- Серверные решения
- Телефония
- Корпоративные сети
- Как использовать команду Strings в Linux
- Использование команды strings
- Установка минимальной длины строки
- Ограничение вывода команды strings командой less
- Использование strings с файлами объектов
- Поиск в конкретной области файла
- Вывод номера строки
- Вывод управляющих символов
- Мы не ограничены только файлами
- Поиск нескольких файлов сразу
- Команда strings распутана
- Кроссплатформенная работа со строками на C++
- gcc не понимает тип string
- Re: gcc не понимает тип string
- gcc не понимает тип string
- Re: gcc не понимает тип string
- Re: gcc не понимает тип string
- gcc не понимает тип string
- Re: gcc не понимает тип string
- Re: re
- Re: re
- Re: gcc не понимает тип string
- Re: gcc не понимает тип string
- Re: re
- Re: re
- Re: re
- Re: re
- Re: re
- Re: re
- Re: re
- Re: re
- C++ String class Examples and Tutorial
- STL C++ string functions:
- Iterator types:
- Code Snipets:
ИТ База знаний
Курс по Asterisk
Полезно
— Узнать IP — адрес компьютера в интернете
— Онлайн генератор устойчивых паролей
— Онлайн калькулятор подсетей
— Калькулятор инсталляции IP — АТС Asterisk
— Руководство администратора FreePBX на русском языке
— Руководство администратора Cisco UCM/CME на русском языке
— Руководство администратора по Linux/Unix
Навигация
Серверные решения
Телефония
FreePBX и Asterisk
Настройка программных телефонов
Корпоративные сети
Протоколы и стандарты
Как использовать команду Strings в Linux
Нужно просмотреть текст внутри двоичного файла или файла данных? Команда Linux strings извлечет и выведет на терминал биты текста, которые называются «строками».
Онлайн курс по Linux
Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps
Linux полон команд, которые могут выглядеть как решения в поисках проблем. Команда strings одна из них. Так, зачем же она нужна? Есть ли похожая команда, которая перечисляет строки для печати из двоичного файла?
Давайте вернемся назад. Двоичные файлы, такие как программные файлы, могут содержать строки читаемого человеком текста. Но как мы их видим? Если использовать cat или less , то, скорее всего, зависнет окно терминала. Программы, предназначенные для работы с текстовыми файлами, не могу обрабатывать исполняемые файлы, содержащие непечатаемые символы.
Большая часть данных в двоичном файле нечитабельна и не могут быть выведены в окно терминала каким-либо образом, так как нет знаков или стандартных символов для представления двоичных значений, которые не соответствуют буквенно-цифровым символам, знакам пунктуации или пробелам. В совокупности они называются «печатаемыми» символами. Остальные — «непечатаемые» символы.
Поэтому попытка просмотра или поиска текстовых строк в двоичном файле или файле данных является проблемой. И вот здесь на помощь спешит strings . Он извлекает строки печатаемых символов из файлов, чтобы другие команды могли использовать эти строки без необходимости контактировать с непечатаемыми символами.
Использование команды strings
На самом деле нет ничего сложного в этой команде: просто передаем команде название файла.
Как пример, мы попробуем просмотреть содержимое исполняемого файла jibber с помощью strings .
На скриншоте ниже список строк, извлечённых из указанного файла:
Установка минимальной длины строки
По умолчанию, команда strings ищет строки, содержащие четыре и более символов. Чтобы изменить значение по умолчанию используется ключ –n .
Имейте ввиду, что чем короче минимальная длина, тем больше шансов получить на выводе бесполезного материала.
Некоторые двоичные значения имеют то же числовое значение, что и значение, представляющее печатаемый символ. Если два из этих числовых значений находятся рядом в файле, а минимальная длина, равна двум, эти байты будут отображаться как строки.
Чтобы установить длину строки равной двум, используйте следующую команду:
Теперь у нас на выводе есть строки, длина который равна двум и более символам. Учтите, что пробел тоже считается печатаемым символом.
Ограничение вывода команды strings командой less
Чтобы ограничить объем выведенной информации вывод команды strings можно передать команде less , а затем прокруткой просматривать всю информацию:
Теперь мы видим список, выводимый командой less , где начало списка отображено первым:
Использование strings с файлами объектов
Обычно исходный код программ компилируется в файлы объектов. Они в свою очередь связаны с файлами библиотек, чтобы создать исполняемый файл. У нас есть файл объектов jibber , давайте посмотрим, что в нем:
Данные выводятся в таблице по 8 колонок, каждая из строк которой заканчивается на букву “H” . В данном примере у нас SQL запрос.
Но если прокрутить ниже, то можно заметить, что форматирование не относится ко всему файлу.
Думаю, интересно видеть разницу между текстовыми строками файла объектов и конечного исполняемого файла.
Поиск в конкретной области файла
Скомпилированные программы имеют различные области, которые используются для хранения текста. По умолчанию, strings ищет текст во всем файле. Это так же, как если бы вы использовали параметр -a (all). Для поиска строк только в инициализированных, загруженных разделах данных в файле используйте параметр -d (data).
Если нет особой причины, то вполне можно обойтись значением по умолчанию.
Вывод номера строки
Иногда бывает необходимо узнать точное смещение, расположение строки в файле. В этом нам поможет ключ –o (offset).
В данном случае номера строки показаны в восьмеричной системе.
Для получения значений в других системах исчисления, достаточно использовать опцию –t , а затем передать нужный ключ: d (десятичная система), x (шестнадцатеричная) или o (восьмеричная). Опция –t с ключом o равнозначна запуску команды strings с ключом –o .
Теперь номера строк показаны в десятичной системе:
А тут в шестнадцатеричной:
Вывод управляющих символов
Команда strings принимает знаки табуляции и пробела, как часть строки, игнорируя при этом символ начала новой строки — /r или возврата каретки — /r . Чтобы включить их отображение нужно добавить ключ –w .
Ниже мы видим пустую строку. Это результат работы управляющих символов: либо символа новой строки, либо символ возврата каретки.
Мы не ограничены только файлами
Мы можем использовать строки с любым, что есть или может создать поток байтов.
С помощью этой команды мы можем просмотреть содержимое оперативной памяти (RAM) нашего компьютера. Нам нужно использовать >sudo, потому что мы получаем доступ /dev/mem . Это символьного файл устройства, в котором хранится изображение оперативной памяти компьютера.
В списке не все содержимое оперативной памяти, а лишь то, что команда strings смогла извлечь.
Поиск нескольких файлов сразу
Маски можно использовать для выбора групп файлов для поиска. Символ * обозначает нуль и больше символов, а символ «?» означает любой отдельный символ. Можно также указать в командной строке множество имен файлов.
Мы будем использовать маску для поиска всех исполняемых файлов в каталоге /bin . Поскольку список будет содержать результаты из многих файлов, будет использоваться параметр -f (имя файла). Имя файла будет напечатано в начале каждой строки. Затем можно просмотреть файл, в котором была найдена данная строка.
Затем передадим результаты через grep и выведем строки, содержащие слово «Copyright»:
Мы получаем упорядоченный список с об авторских правах каждого файла в каталоге /bin , с именем файла в начале каждой строки.
Команда strings распутана
Команда strings – это не какая-то тайная команда. Это обычная команда Linux. Он делает выполняет конкретные задачи и делает это очень хорошо. Это еще один из преимуществ Linux, и действительно мощных в сочетании с другими командами. Когда вы видите, как он может оперировать двоичными файлами и другими инструментами, такими как grep, начинаете по-настоящему ценить функциональность этой слегка непонятной команды.
Онлайн курс по Linux
Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps
Источник
Кроссплатформенная работа со строками на C++
Не так давно озадачился вопросом кроссплатформенной работы со строками в приложениях c++. Задача была, грубо говоря, поставлена как регистронезависимый поиск подстроки в любой кодировке на любой платформе.
Итак, первое с чем пришлось понять — что со строками в Линуксе нужно работать в кодировке UTF-8 и в типе std::string, а в Windows строки должны быть в UTF-16LE (тип std::wstring). Почему? Потому что это by design операционных систем. Хранить строки в std::wstring в Линуксе крайне накладно, поскольку один символ wchar_t занимает 4 байта (в Windows — 2 байта), а работать std::string в Windows нужно было во времена Windows 98. Для работы со строками определяем свой платформонезависимый тип:
Второе — задача преобразование текста из любой кодировки в тип mstring. Тут вариантов не так много. Первый вариант — использование std::locale и прочих соответствующих стандартных вещей. Сразу бросилось в глаза необходимость поиска для каждого charset’a соотвествующей ему локали (типа кодировке «windows-1251» соответствует локаль Russian_Russia.1251 и т.п.). В стандартной библиотеке такая таблица не нашлась (может плохо искал?), искать примочку для списка локалей не захотелось. Да и вообще, работа с локалалями в C++ вещь очень неочевидная, на мой взгляд. На форумах советовали использовать библиотеки libiconv или icu. libiconv выглядел очень легко и просто, с задачей перекодировки из любого charset’a в mstring справлялся отлично, но когда дело дошло до преобразования mstring в нижний регистр меня постиг fail. Оказалось libiconv делать это не умеет, а преобразовать строку utf8 в нижний регистр просто и красиво в Линуксе у меня не получилось. Итак, выбор пал на icu, который с честью решил все поставленные задачи (конвертация и перевод в нижний регистр). Процедура платформонезависимой перекодировки с использованием библиотеки icu выглядит примерно так:
Вопросы работы с Юникодом в Windows описывать не буду — все там достаточно хорошо документировано.
Источник
gcc не понимает тип string
помогите разобраться в файле есть строки
при попытке компиляции gcc выдает что типа string он не знает можно конечно заменить string на char * но интересен сам факт может кто нить знает как режить проблемму
Re: gcc не понимает тип string
А где сказано, что тип string существует?
gcc не понимает тип string
да точно типа string не существует так написано man string
тогда кто нить занет структуры стринг что бы ее определить
шутники однако «не существует» 🙂
Re: gcc не понимает тип string
char*, gcc, std::string, g++,
Re: gcc не понимает тип string
gcc не понимает тип string
я не понял последнего сообщения это типа using namespace std;
Re: gcc не понимает тип string
include вообще не понимает все перепробовал ни один пример не работает
бросил string написал char str[255]
Re: re
>gcc не понимает тип string
Re: re
Re: gcc не понимает тип string
может быть имеет смысл спросить на какой языке пишет rh9?
Re: gcc не понимает тип string
>gcc не понимает тип string
Зато g++ понимает. gcc — для Си, g++ — для С++
Re: re
потому что руки не из жопы, как тут у некоторых
Re: re
А ты не gcc а g++ дёргай — тогда сразу волшебным образом string появится.
Re: re
Re: re
1. Не оператором а именем
2. return 0 в main лишнее
3. Нахрена тебе компилить в объектник, можно сразу в бинарь
а так все верно
Re: re
Если уж быть последовательным — cout никак не оператор, а стандартный поток вывода. Оператор же напр. ★★★★★ ( 04.11.05 16:32:25 )
using namespace . разрешает, описался. моно писать usin std::cout; напр. Тоже работает не только для операторов;-)
Re: re
> [не указывать return — можно, но не желательно]
смотря в каком языке. в С++ обязательно, в Си — нет, что-то функция вернет, а вот что неизвестно 🙂
Re: re
> Не лишнее, так как :
> int main(int argc, char* argv[])
> [не указывать return — можно, но не желательно]
Не надо распространять заблуждения.
Стандарт C++ (в отличие от C) _допускает_ выход из main()
без exit() и return, причем эта ситуация явно описана:
If control reaches the end of main without encountering a return
statement, the effect is that of executing return 0.
Нет тут ничего нежелательного.
Re: re
Я не сказал что нельзя, и не сказал что не_желательно для компилятора — ему пофиг. в int main(int argc, char* argv[]) стоит инт, поэтому мне кажецца безпочвенным. З.Ы.: К этому можно есчо и написание в коде коментариев приплести.
Да накрутил немножко. 2aton Погорячился, 3 дня не сплю. Извени если обидел.
Источник
C++ String class Examples and Tutorial
C++ may use the C char variable type and string functions but they rely on a null termination and proper memory allocation to hold the string. The ANSI C++ GNU string classes included in the C++ standard library attempt to simplify string manipulation by automating much of the memory allocation and management. Included in this tutorial are examples of the string classes included with the GNU g++ compiler on Linux. This string class is cross platform and included with both Unix/Linux ANSI and Microsoft Visual C++ compilers. Because it is standard with cross platform availability, the «string» class is preferred over the Microsoft MFC «String» class.
Related YoLinux Tutorials:
Simple example of a program using string class and comparison with C char:
C++ String Class: | C character: |
---|
Compile: g++ stringtest.cpp -o stringtest
Run: ./stringtest
Results for both examples:
The C and C++ methods of managing a character data type are both valid but we will see that the C++ string class offers more functionality and convenience. The STL string does not require memory to be pre-allocated nor allocated manually. The STL string class also provides many methods of string assignment.
Find: (also rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of())
- Val.find(const string& argument)
Find first occurence of argument within string Val - find(const string& argument, size_type index)
Find first occurence of argument within string Val starting search from position index. - find(const char* argument)
- find(const char* argument, size_type index)
- find(const char* argument, size_type index, size_type length)
Find first occurence of argument within string Val starting search from position index and search for length number of characters.
STL C++ string functions:
Assuming declaration: string Var;
Function/Operation | Description | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Var = string2 Var.assign(«string-to-assign«) | Assignment of value to string (operator=). When assigning a C «char» data type, first check if NULL to avoid failure/crash. i.e.: if( szVar ) sVar.assign( szVar ); where szVar is a C «char *» data type and sVar is of type «string». | |||||||||||||||||||||||
Var.swap(string2) swap(string1,string2) | Swap with value held in string2. Function swap will exchange contents of two string class variables. | |||||||||||||||||||||||
Var += string2 Var.append() Var.push_back() | Append string/characters to the end of the string. For string Var("abc"); the call to Var.append("xyz") will result in the string «abcxyz». | |||||||||||||||||||||||
Var.insert(size_t position, string) Var.insert(size_t position, char *) Var.insert(size_t position, string, size_t pos1, size_t len) Var.insert(size_t position, char *, size_t pos1, size_t len) | Insert characters. position: insert before this character position. If 0 then insert before the string pos1: position of the first char of the string being inserted len: length of string to be inserted | |||||||||||||||||||||||
Var.erase() Var = «» | Clear string variable. No arguments necessary. | |||||||||||||||||||||||
+ | Concatenate | |||||||||||||||||||||||
==, !=, , >= | Compare strings. | |||||||||||||||||||||||
Var.compare(string) Var.compare( size_t pos1, size_t len, string ) const; Var.compare( size_t pos1, size_t len1, const string, size_t pos2, size_t len2 ) const; | Compare strings. Returns int:
Where string is another STL string or null terminated C string. | |||||||||||||||||||||||
Var.length() | Return memory allocated to storage of the string. No arguments necessary. The methods length(), size() and capacity() all return the same value. | |||||||||||||||||||||||
Var.size() | Return length of string. No arguments necessary. | |||||||||||||||||||||||
Var.capacity() | Return length of string + 1. Red Hat 7.x. Red Hat 8.0+ returns the number of characters without the «+1». Number of characters that can be held without re-allocation. No arguments necessary. | |||||||||||||||||||||||
Var.max_size() | Returns a very large number. No arguments necessary. | |||||||||||||||||||||||
Var.empty() | Returns 1 if an empty string. Returns 0 if not empty. | |||||||||||||||||||||||
> getline() | Input stream | |||||||||||||||||||||||
Var.c_str() | Returns C string pointer. C char string is null terminated. Do not free memory using this pointer! | |||||||||||||||||||||||
Var.data() | Returns C string pointer. C char string is NOT null terminated. Do not free memory using this pointer! | |||||||||||||||||||||||
Var[] Var.at(integer) | Access individual characters. Return single character at specified position (integer). For Var("abc");, Var[2] returns «c». | |||||||||||||||||||||||
Var.copy(char *str,size_t len, size_t index) | str: allocated char storage to which the copy ismade len: the number of characters to copy index: the starting place in the string from which to start the copy. Counting starts from 0 returns the number of characters copied | |||||||||||||||||||||||
Var.find(string) Var.find(string, positionFirstChar) Var.find(string, positionFirstChar, len) | Find first occurance of string or substring. Returns int position of first occurance in string. Where len is the length of the sequence to search for. Returns string::npos if not found. i.e. if(Var.find("abc") == string::npos) cout Iterator types:
ANSI C++ string class and the C standard library: |
Function | Description |
---|---|
std::string to_string( int value ); | Returns a string given an integer |
std::string to_string( long long value ); | Returns a string given a long long |
std::string to_string( unsigned value ); | Returns a string given an unsigned |
std::string to_string( unsigned long value ); | Returns a string given an unsigned long |
std::string to_string( unsigned long long value ); | Returns a string given an unsigned long long |
std::string to_string( float value ); | Returns a string given a float |
std::string to_string( double value ); | Returns a string given a double |
std::string to_string( long double value ); | Returns a string given an long double |
Example:
Example of a program using many of the build-in functions of the string class:
Compile: g++ program.cpp
[Potential Pitfall] : In Red Hat Linux versions 7.x one could omit the "using namespace std;" statement. Use of this statement is good programming practice and is required in Red Hat 8.0.
[Potential Pitfall] : Red Hat 8.0 requires the reference to "#include ". Red Hat versions 7.x used "#include ". (Also fstream, . )
Code Snipets:
- Read lines from standard input:
The first thing you will notice when using the C++ string class is that you can't de-reference any of the string class variables directly with GDB, ddd. One must create a helper routine (for older versions of gdb) or use string class funtions (newer versions of gdb) to print out the value of the string variable.
Compile program with symbolic code for the debugger: g++ -g testprog.cpp
Start gdb debugger: gdb ./a.out
With newer versions of gdb, one may use built-in string class functions:
- The string class is NOT a native data type, it is an object class and thus can not be handled like the traditional pointer to variable in gdb.
- One can pass strings by reference (i.e. argument declarations using (string& variable-name )), by value (string variable-name ), and by pointer (string *variable-name ).
- When using a reference, one may mimic the protection of a variable that passing by value enables by using (const string& variable-name )
The C++ Standard Library: A Tutorial Reference Nicolai M. Josuttis ISBN #0201379260, Addison Wesley Longman This book is the only book I have seen which covers string classes as implemented by current Linux distributions. It offers extensive coverage of the C++ string classes as well as fairly complete coverage of the C++ Standard Template Library (STL). | ||
C++ How to Program by Harvey M. Deitel, Paul J. Deitel ISBN #0131857576, Prentice Hall Fifth edition. The first edition of this book (and Professor Sheely at UTA) taught me to program C++. It is complete and covers all the nuances of the C++ language. It also has good code examples. Good for both learning and reference. Источник |