Практическое значение передачи данных в программу
Если у вас есть опыт работы в командной строке GNU/Linux, вы знаете, что у большинства команд есть ключи и аргументы. Например, при просмотре содержимого каталогов, копировании, перемещении в качестве аргументов указываются объекты файловой системы, над которыми выполняется команда. Особенности ее выполнения определяются с помощью ключей. Например, в команде
cp -r ../les_1 ../les_101
cp — это имя команды, -r — ключ, а ../les_1 и ../les_101 — аргументы команды.
Нередко в программы при их запуске передаются адреса файлов и «модификаторы» (это ключи) процесса выполнения программы.
Напишем программу, которая открывает указанные пользователем в командной строке файлы на запись или добавление и записывает (добавляет) туда одну и туже информацию, которую пользователь вводит с клавиатуры в процессе выполнения программы:
#include <stdio.h> #include <string.h> int main (int argc, char **argv) { int i, ch; FILE *f5; if (argc < 3 || argc > 7) { puts("Неверное количество параметров"); return 1; } if (strcmp(argv1, "-w") != && strcmp(argv1, "-a") != ) { puts("Первый параметр -w или -a"); return 2; } for (i=; i < argc-2; i++){ fi = fopen(argvi+2, argv1+1); if (fi == NULL) { printf("Файл %s нельзя открыть\n", argvi+2); return 3; } } while ((ch = getchar()) != EOF) for (i=; i < argc-2; i++) putc(ch,fi); for (i=; i < argc-2; i++) fclose(fi); return ; }
Пояснения к коду:
- Создается массив из пяти файловых указателей. Следовательно можно одновременно открыть не более пяти файлов. Файловый указатель первого файла будет хранится в элементе массива f, второго — в f и т.д.
- Проверяется количество аргументов командной строки. Их должно быть не меньше трех, т.к. первый — это имя программы, второй — режим открытия файла, третий — первый или единственный файл, в который будет производится запись. Поскольку программа позволяет открыть только пять файлов, то общее число аргументов командной строки не может быть больше семи. Поэтому если количество аргументов меньше 3 или больше 7, то программа завершается, т.к. оператор приводит к выходу из функции, даже если после него есть еще код. Возвращаемое из функции значение неравное 0, может быть интерпретировано родительским процессом, как сообщение о том, что программа завершилась с ошибкой.
- Проверяется корректность второго аргумента командной строки. Если он не равен ни «-w», ни «-a», то условное выражение во втором возвращает 1 (true). Функция позволяет сравнивать строки и возвращает 0 в случае их равенства.
- В цикле открываются файлы по указанным адресам, которые начинаются с третьего элемента массива argv. Именно поэтому к i прибавляется 2, чтобы получать элементы массива argv, начиная с третьего. Выражение указывает на количество переданных имен файлов; т.к. в argc хранится общее число аргументов командной строки, первые два из которых не являются именами файлов.
- Выражение позволяет «вырезать» из строки «-w» (или «-a») подстроку «w» (или «a»), т.к. по сути указатель на первый элемент строки. Прибавляя к указателю единицу, мы смещаем его к следующему элементу массива.
- Если файл отрыть не удается, то функция возвращает NULL. В таком случае программа завершается.
- Каждый символ, введенный пользователем с клавиатуры, записывается во все открытые файлы.
- В конце файлы закрываются.
_fcvt
char* _fcvt( double number, int num_dec, int* dec_pos, int* has_sign );
Возвращает адрес буфера, содержащего строковое представление дробного числа
number в десятичной форме; заметим, что этот буфер
перезаписывается при каждом вызове функции. Через параметр
num_dec необходимо передать требуемое количество
десятичных знаков; при необходимости исходное число будет округлено или дополнено
нулями. В переменную по адресу dec_pos будет записана
требуемая позиция десятичной точки в возвращенной строке; при этом, если целая часть
числа равна 0, то по этому адресу будет записано отрицательное или нулевое значение.
В переменную по адресу has_sign записывается ненулевое
значение для отрицательного исходного числа и 0 — в противном случае.
Таким образом, возвращаемая данной функцией строка не содержит ни знака, ни десятичной
точки; ниже рассматривается несколько примеров:
strtok
char* strtok( char* src, const char* seps );
Последовательно разбивает строку src на лексемы
(токены), считая разделителями все символы строки seps.
При каждом вызове возвращается указатель на очередную найденную лексему или NULL, если
достигнут конец строки src. Отметим, что данная функция
модифицирует исходную строку. Пример использования:
Обратите внимание, что указатель на исходную строку передается только при первом вызове
функции; при последующих вызовах для работы с этой же строкой необходимо в качестве ее
адреса передавать значение NULL. Естественно, что в реальных случаях обработка лексем
выполняется в цикле, завершающемся при достижении конца исходной строки:
Текстовый ввод/вывод
Заголовочный файл | #include <stdio.h> |
Поскольку нашей основной целью является создание Windows-приложений, взаимодействующих
с пользователем посредством GUI, мы рассмотрим только две функции стандартной библиотеки,
предназначенные для текстового ввода/вывода.
Создание строк в ардуино с помощью String
В ардуино у нас есть несколько способов создать строку, приведем основные:
- char myCharStr = “Start”; – массив типа char с завершающим пустым символом;
- String myStr = “Start”; – объявляем переменную, создаем экземпляр класса String и записываем в него константу-строку.
- String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы
- String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.
- String myStr = String(50); – создаем строку из целого числа (преобразование int to string).
- String myStr = String(30, H); – создаем строку – представление числа в 16-чной системе (HEX to String)
- String myStr = String(16, B); – создаем строку – представление числа в двоичной системе (Byte to String).
Каждый раз, когда мы объявляем в коде строку с использованием двойных кавычек, мы создаем неявный объект класса String, являющийся константой. При этом обязательно использование именно двойных кавычек: “String” – это строка. Одинарные кавычки нужны для обозначения отдельных символов. ‘S’ – это символ.
Аргументы командной строки
Из урока №3 мы уже знаем, что при компиляции и линкинге, компилятор создает исполняемый файл. Когда программа запускается, выполнение начинается с первой строки функции main(). До этого урока мы объявляли main() следующим образом:
int main()
1 | intmain() |
Обратите внимание, в этой версии функции main() никаких параметров нет. Тем не менее, многие программы нуждаются в некоторых входных данных
Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция picture() узнает, какое изображение нужно принять и обработать? Пользователь должен сообщить программе, какой файл следует открыть. Это можно сделать следующим образом:
// Программа: Picture
#include <iostream>
#include <string>
int main()
{
std::cout << «Enter name of image-file to create a thumbnail for: «;
std::string filename;
std::cin >> filename;
// Открываем файл-изображение
// Создаем миниатюру
// Выводим миниатюру
}
1 |
// Программа: Picture intmain() { std::cout<<«Enter name of image-file to create a thumbnail for: «; std::stringfilename; std::cin>>filename; // Открываем файл-изображение // Создаем миниатюру // Выводим миниатюру } |
Тем не менее, здесь есть потенциальная проблема. Каждый раз при запуске программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.
Рассмотрим это детально. Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определенном каталоге. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, такой подход будет, мягко говоря, не очень эффективным! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз функцию picture() для каждого файла.
Теперь рассмотрим случай, когда у вас есть веб-сайт, и вы хотите, чтобы он создавал миниатюру каждый раз, когда пользователь загружает изображение на сайт. Эта программа не может принимать входные данные из Интернета и следует логический вопрос: «Как тогда вводить имя файла?». Выходом является вызов веб-сервером функции picture() автоматически каждый раз после загрузки файла.
В обоих случаях нам нужно, чтобы внешняя программа передавала имя файла в качестве входных данных в нашу программу при её запуске, вместо того, чтобы функция picture() сама дожидалась, пока пользователь вручную введет имя файла.
Аргументы командной строки — это необязательные строковые аргументы, передаваемые операционной системой в программу при её запуске. Программа может их использовать в качестве входных данных, либо игнорировать. Подобно тому, как параметры одной функции предоставляют данные для параметров другой функции, так и аргументы командной строки предоставляют возможность людям или программам предоставлять входные данные для программы.
Конвертировать QDatetime в QString
String QDateTime::toString(Формат QStringView) const // формат для преобразования
Примеры:
Ссылка на формат:
Expression |
Output |
d |
the day as number without a leading zero (1 to 31) |
dd |
the day as number with a leading zero (01 to 31) |
ddd |
the abbreviated localized day name (e.g. ‘Mon’ to ‘Sun’). Uses the system locale to localize the name, i.e. (). |
dddd |
the long localized day name (e.g. ‘Monday’ to ‘Sunday’). Uses the system locale to localize the name, i.e. (). |
M |
the month as number without a leading zero (1-12) |
MM |
the month as number with a leading zero (01-12) |
MMM |
the abbreviated localized month name (e.g. ‘Jan’ to ‘Dec’). Uses the system locale to localize the name, i.e. (). |
MMMM |
the long localized month name (e.g. ‘January’ to ‘December’). Uses the system locale to localize the name, i.e. (). |
yy |
the year as two digit number (00-99) |
yyyy |
the year as four digit number |
These expressions may be used for the time:
Expression |
Output |
h |
the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display) |
hh |
the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display) |
H |
the hour without a leading zero (0 to 23, even with AM/PM display) |
HH |
the hour with a leading zero (00 to 23, even with AM/PM display) |
m |
the minute without a leading zero (0 to 59) |
mm |
the minute with a leading zero (00 to 59) |
s |
the whole second without a leading zero (0 to 59) |
ss |
the whole second with a leading zero where applicable (00 to 59) |
z |
the fractional part of the second, to go after a decimal point, without trailing zeroes (0 to 999). Thus «s.z» reports the seconds to full available (millisecond) precision without trailing zeroes. |
zzz |
the fractional part of the second, to millisecond precision, including trailing zeroes where applicable (000 to 999). |
AP or A |
use AM/PM display. A/AP will be replaced by either «AM» or «PM». |
ap or a |
use am/pm display. a/ap will be replaced by either «am» or «pm». |
t |
the timezone (for example «CEST») |
Пример. преобразование из CString
Описание
В этом примере показано, как преобразовать из в в другие типы строк, перечисленные выше. основан на типе данных TCHAR, который, в свою очередь, зависит от того, определен ли символ. Если значение не определено, то оно определено как char и содержит строку многобайтовых символов; если определено, то оно определяется как и содержит строку расширенных символов.
всегда является версией многобайтовой строки . она является версией только расширенных символов. Не используйте и для определения того, как они должны компилироваться. и используются в этом примере для уточнения незначительных различий в выделении размера буфера и обработке вывода.
Анализ аргументов командной строки C++
-
Аргументы разделяются пробелами (пробел или табуляция).
-
Первый аргумент () обрабатывается особым образом. Он представляет имя программы. Это должен быть допустимый путь, поэтому разрешены части, заключенные в двойные кавычки ( ). Эти знаки двойных кавычек не включаются в выходные данные . Части, заключенные в двойные кавычки, не позволяют интерпретировать пробел или знак табуляции char актер в качестве конца аргумента. Последующие правила в этом списке не применяются.
-
Строка, заключенная в двойные кавычки, интерпретируется как один аргумент, который может содержать пробелы в char актерс. Строку в кавычках можно встроить в аргумент. Курсор ( ) не распознается как escape- char актер или разделитель. Внутри заключенной в кавычки строки пара двойных кавычек интерпретируется как одна экранированная двойная кавычка. Если командная строка заканчивается до тех пор, пока не будет найдена закрывающая двойная кавычка, то все char прочитанные актерс будут выводиться в качестве последнего аргумента.
-
Символ двойной кавычки после обратной косой черты ( ) интерпретируется как литеральный символ двойной кавычки ( ).
-
Символы обратной косой черты считаются литералами, если сразу за ними не стоит двойная кавычка.
-
Если двойная кавычка стоит после четного числа символов обратной косой черты, в массив помещается по одному символу обратной косой черты ( ) для каждой пары символов обратной косой черты ( ), а сама двойная кавычка ( ) интерпретируется как разделитель строк.
-
Если двойная кавычка стоит после нечетного числа символов обратной косой черты, в массив помещается по одному символу обратной косой черты ( ) для каждой пары символов обратной косой черты ( ). Двойная кавычка интерпретируется как escape-последовательность путем main обратной косой черты, что приводит к тому, что литеральная двойная кавычка ( ) будет помещена в .
Результаты синтаксического анализа командных строк
В следующей таблице показаны примеры входных данных и ожидаемые выходные данные, иллюстрирующие применение правил из приведенного выше списка.
Входные данные командной строки | argv | argv | argv3-5 |
---|---|---|---|
5 ответов
Лучший ответ
Либо передайте их как параметры, либо сохраните в глобальных переменных. Пока вы не вернетесь из main и не попытаетесь обработать их в обработчике или деструкторе объекта в глобальной области видимости, они все еще существуют, и к ним можно будет получить доступ из любой области.
Например:
Альтернативно:
Передача их в качестве параметров — лучший дизайн, поскольку он инкапсулирован и позволяет вам изменять / заменять параметры, если вы хотите, или легко преобразовать вашу программу в библиотеку. Глобальные переменные проще, поскольку, если у вас есть много разных функций, которые по какой-либо причине обращаются к аргументам, вы можете просто сохранить их один раз, и вам не нужно постоянно передавать их между всеми различными функциями.
4
Adam Rosenfield
12 Окт 2012 в 15:55
Linux предоставляет и .
Mike
27 Сен 2018 в 20:58
Посмотрите » «семейство функций и библиотек. Они предлагают структурированный способ определения аргументов, ожидаемых вашей программой, и могут затем легко их проанализировать для вас. Также может помочь с созданием документации / справочных ответов.
Это старая библиотека в мире UNIX, и на C # тоже есть реализация .Net. (+ Perl, Ruby и, возможно, другие. Приятно иметь единую парадигму, применимую ко всем этим! Изучите один раз, используйте везде!)
dsz
13 Авг 2015 в 23:22
Просто передайте и в качестве аргументов функции, в которой вы хотите их обработать.
2
tomahh
12 Окт 2012 в 15:54
Следует придерживаться стандартов везде, где это возможно. Таким образом, не пишите
Который никогда не был действительным C или C ++, но вместо этого напишите
При этом ваш код может компилироваться, например, с (с обычными параметрами компилятора).
Учитывая , я подозреваю, что это среда Windows. В любом случае, для поддержки использования вашей программы в среде Windows вам не следует использовать аргументы в Windows. Они работают в * nix, потому что были разработаны в этой среде и для нее; они, как правило, не работают в Windows, потому что по умолчанию (по очень строгому соглашению) они кодируются как Windows ANSI, что означает, что они не могут кодировать имена файлов с символами вне текущей локали пользователя.
Поэтому для Windows лучше использовать функция API и ее родственная функция синтаксического анализа. Для переносимости его лучше инкапсулировать в какой-нибудь модуль аргументов командной строки. Затем вам нужно решить интересную проблему использования в Windows и в * nix…
В любом случае, я не уверен в соответствующем * nix API, или даже если он есть, но погуглите. В худшем случае для * nix вы всегда можете инициализировать модуль аргументов командной строки из . Уродство для * nix напрямую связано с необходимостью поддержки переносимости с помощью самой непереносимой, специфичной для ОС конструкции C ++, а именно стандартной .
4
S.S. Anne
2 Янв 2020 в 22:39
Обработка числовых аргументов
Аргументы командной строки всегда передаются в качестве строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в виде числа, вам нужно будет конвертировать его из строки в число. К сожалению, в языке C++ это делается немного сложнее, чем должно быть:
#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()
int main(int argc, char *argv[])
{
if (argc <= 1)
{
// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы
// Обрабатываем случай, когда argv может быть пустым или не пустым
if (argv)
std::cout << «Usage: » << argv << » <number>» << ‘\n’;
else
std::cout << «Usage: <program name> <number>» << ‘\n’;
exit(1);
}
std::stringstream convert(argv); // создаем переменную stringstream с именем convert, инициализируя её значением argv
int myint;
if (!(convert >> myint)) // выполняем конвертацию
myint = 0; // если конвертация терпит неудачу, то присваиваем myint значение по умолчанию
std::cout << «Got integer: » << myint << ‘\n’;
return 0;
}
1 |
#include <iostream> intmain(intargc,char*argv) { if(argc<=1) { // В некоторых операционных системах argv может быть просто пустой строкой, без имени программы // Обрабатываем случай, когда argv может быть пустым или не пустым if(argv) std::cout<<«Usage: «<<argv<<» <number>»<<‘\n’; else std::cout<<«Usage: <program name> <number>»<<‘\n’; exit(1); } std::stringstream convert(argv1);// создаем переменную stringstream с именем convert, инициализируя её значением argv intmyint; if(!(convert>>myint))// выполняем конвертацию myint=;// если конвертация терпит неудачу, то присваиваем myint значение по умолчанию std::cout<<«Got integer: «<<myint<<‘\n’; return; } |
Если мы запустим эту программу с аргументом командной строки , то результатом будет:
std::stringstream работает почти так же, как и std::cin. Здесь мы инициализируем переменную std::stringstream значением , так что мы можем использовать оператор для извлечения значения в переменную типа int.
Массивы строк в С
Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис: char имя;
Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:
char strs;
При объявлении массивов строк можно производить инициализацию: char имя = {строковый литерал №1, … строковый литерал №N};
Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля).
Например:
char days = { «Январь», «Февраль», «Март», ”Апрель», «Май», «Июнь», «Июль», «Август», «Сентябрь»,»Октябрь», «Ноябрь», «Декабрь»};
При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов. Например, массив из семи строк:
char days[] = { «Понедельник», «Вторник», «Среда», «Четверг», «Пятница», «Суббота», «Воскресенье»};
Передача аргументов командной строки
Исполняемые программы могут запускаться в командной строке через вызов. Например, для запуска исполняемого файла , который находится в корневом каталоге диска C в Windows, вам нужно ввести:
Чтобы передать аргументы командной строки в , вам нужно будет их просто перечислить после имени исполняемого файла:
Теперь, при запуске , будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:
Это также работает и с Linux (хотя структура каталогов будет отличаться от структуры каталогов в Windows).
Если вы запускаете свою программу из среды IDE, то ваша IDE должна предоставить способ ввода аргументов командной строки.
Для пользователей Visual Studio: Щелкните правой кнопкой мыши по нужному проекту в меню :
Затем выберите . На правой панели будет строка . Вы сможете здесь ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске:
Пользователям Code::Blocks: Выберите :
Использование аргументов командной строки
Теперь, когда вы знаете, как передавать аргументы командной строки в программу, следующим шагом будет доступ к ним из программы. Для этого используется уже другая форма функции main(), которая принимает два аргумента ( и ) следующим образом:
int main(int argc, char *argv[])
1 | intmain(intargc,char*argv) |
Также вы можете увидеть и такой вариант:
int main(int argc, char** argv)
1 | intmain(intargc,char**argv) |
Хоть оба эти варианта идентичны по своей сути, но рекомендуется использовать первый, так как он интуитивно понятнее.
(англ. «argument count» = «количество аргументов») — это целочисленный параметр, содержащий количество аргументов, переданных в программу. всегда будет как минимум один, так как первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, который предоставляет пользователь, заставит увеличиться на единицу.
(англ. «argument values» = «значения аргументов») — это место, где хранятся фактические значения аргументов. Хотя объявление выглядит немного пугающе, но это всего лишь массив строк C-style. Длиной этого массива является .
Давайте напишем короткую программу , которая будет выводить значения всех аргументов командной строки:
// Программа MyArguments
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << «There are » << argc << » arguments:\n»;
// Перебираем каждый аргумент и выводим его порядковый номер и значение
for (int count=0; count < argc; ++count)
std::cout << count << » » << argv << ‘\n’;
return 0;
}
1 |
// Программа MyArguments intmain(intargc,char*argv) { std::cout<<«There are «<<argc<<» arguments:\n»; // Перебираем каждый аргумент и выводим его порядковый номер и значение for(intcount=;count<argc;++count) std::cout<<count<<» «<<argvcount<<‘\n’; return; } |
Теперь, при вызове с аргументами командной строки и , вывод будет следующим:
Нулевой параметр — это путь и имя текущей программы. Первый и второй параметры здесь являются аргументами командной строки, которые мы передали.
envp -Command-Line-Argument «>envp аргумента командной строки
Сигнатуры или позволяют дополнительному расширению для доступа к переменным среды, относящимся к Microsoft. это расширение также распространено в других компиляторах для Windows и UNIX систем. Имя является традиционным, но вы можете присвоить параметру среды любое имя. Ниже приведены эффективные объявления для списков аргументов, включающих параметр среды:
Необязательный параметр представляет собой массив строк, представляющих переменные, заданные в среде пользователя. Этот массив завершается записью NULL. Он может быть объявлен как массив указателей на ( ) или как указатель на указатели на ( ). Если программа использует вместо , используйте тип данных вместо .
Блок среды, переданный в и , является замороженной копией текущей среды. Если впоследствии среда будет изменена путем вызова или , то текущая среда (как возвращаемая переменной или, а также переменная или) изменится , но блок, на который указывает, не изменится. Дополнительные сведения о подавлении обработки среды см. в разделе . Аргумент совместим с стандартом C89, но не с стандартами C++.
Main «>примеры аргументов
Объединение строк Arduino
Объединить две строки в одну можно различными способами. Эта операция также называется конкатенацией. В ее результате получается новый объект String, состоящий из двух соединенных строк. Добавить к строке можно различные символы:
- String3 = string1 + 111; // позволяет прибавить к строке числовую константу. Число должно быть целым.
- String3 = string1 + 111111111; // добавляет к строке длинное целое число
- String3 = string1 + ‘А’; // добавляет символ к строке
- String3 = string1 + “aaa”;// добавляет строковую постоянную.
- String3 = string1 + string2; // объединяет две строки вместе.
Важно осторожно объединять две строки из разных типов данных, так как это может привести к ошибке или неправильному результату
Для чего нужен String в ардуино
Стандартным способом работы со строками в языке C является использование массива символов. Это все означало необходимость работы с указателями и понимания адресной арифметики. В ардуино и C++ у программистов появилось гораздо больше возможностей. Все “низкоуровневые” операции по работе со строкой выделены в отдельный класс, а для основных операций даже переопределены операторы. Например, для объединения срок мы просто используем хорошо знакомый знак “+”, а не зубодробильные функции типа malloc и strcpy. С помощью String мы работаем со строкой как с целым объектом, а не рассматриваем его как массив символов. Это позволяет сосредоточиться на логике скетча, а не деталях реализации хранения символов в памяти.
Естественно, у любого “упрощения” всегда есть свои подводные камни. String всегда использует больше оперативной памяти и в некоторых случаях функции класса могут медленнее обрабатываться. Поэтому в реальных больших проектах придется тщательно взвешивать все плюсы и минусы и не забывать, что никто не мешает нам работать со строками в стиле С. Все обычные функции обработки массивов char остаются в нашем арсенале и в arduino.