Передача строки в функцию
- Войдите на сайт для отправки комментариев
Пт, 28/02/2020 - 21:59
Подскажите, пожалуйста, почему второй пример работает неправильно
1.
char c[] = "this is a test"; void setup() { Serial.begin(9600); for (int i = 0; i < sizeof(c) - 1; i++) { Serial.print(i, DEC); Serial.print(" = "); Serial.write(c[i]); Serial.println(); } } void loop() { }
2.
void print(char c[]) { for (int i = 0; i < sizeof(c) ; i++) { Serial.print(i, DEC); Serial.print(" = "); Serial.write(c[i]); Serial.println(); } } void setup() { Serial.begin(9600); print("this is a test"); } void loop() { }
Он работает правильно. В точности так, как написан.
Если вопрос "почему он не делает того, чего я от него жду?", то потрудитесь объяснить, а чего именно Вы от него ждёте.
Ага, понятно - почитайте про указатели.
"Правильно заданный вопрос содержит половину ответа". Имел в виду, почему оба примера не работают одинаково. Так понимаю, нужно смотреть в сторону шаблонов и указателей. А со строками или массивами символов более простого варианта нет?
Так понимаю, нужно смотреть в сторону шаблонов и указателей. А со строками или массивами символов более простого варианта нет?
Неправильно понимаете. Смотреть надо в сторону Кернигана и Ритчи. Когда посмотрите, то узнаете, что между строками, массивами символов и указателями разницы не то, чтобы совсем нет, но она там исключительно на уровне "синтаксического сахара" - по гамбургскому счёт это одно и то же.
Поэтому, понимаете, что на Ваш вопрос ответить очень трудно. Варианты есть, но все они одновременно и про строки, и про указатели, и про массивы символов. Как Вы их разделяете, только Вы знаете.
P.S. А начните с того, что <непереводимая игра слов> включите, наконец, в ИДЕ вывод сообщений компилятора, и ЧИТАЙТЕ, что он Вам говорит! Он ведь Вам честно сказал, как именно будет работать второй пример! Только Вы не прочитали.
Женя! Я все-таки отвечу. В рамках исправления кармы, о чем ты начал писать в Отвлеченных. ;))
------------
2ТС:
В функцию передается только указатель на начало массива. Массив в С и С++ не объект, включающий свой размер, тип, блэкджек и дамочек, а лишь указатель на его начало. Если функции нужно знать что-то еще, это нужно явно ей передать.
Поэтому sizeof в твоей функции честно возвращает sizeof(char *), то есть 2.
В некоторых случаях, когда явно известен размер массива, sizeof вернет этот размер. А вот когда - посоветую разобраться самому, почитав правильные книжки.
Спасибо, буду изучать тему.
- sizeof() здесь не уместен, используйте strlen().
- аргумент фунrции должен быть указателем на первый символ, т.е. char*