|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Добрый вечер. Вопрос по чистому Си. Надо сделать строку и текста и нескольких переменных. Типа такой: "server=127.0.0.1 login=admin" 127.0.0.1 и admin взять из переменных. так работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Но, можно ли как-то за одну операцию объединить несколько строк, а не использовать много раз strcat? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2022, 22:40 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
И второй вопрос, совсем простой. Присвоить значение строке почему-то получается только при объявлении переменной. Если написать в функции: ip_var="127.0.1.1"; то ошибка: error: incompatible types when assigning to type ‘char[1024]’ from type ‘char *’ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2022, 22:45 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Когда-то давным-давно, когда Си был ещё Кернигана и Ричи, в нём существовали функции concat() и strrcpy(), которые делали в точности то, что ты хочешь. С тех пор их выпилили. Теперь рекомендуют С++: Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2022, 23:30 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ, printf выводит по шаблону сколько угодно аргументов, аргументы через запятую после Шаблона Код: plaintext 1.
Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2022, 23:43 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Насколько помню, sprintf/snprintf пока еще с нами. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2022, 23:54 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Функциональный стиль в сях не работает обычно. Поэтому композицию нескольких кон-катов не получается сделать в каком-то достойном и безопасном стиле. Strcat как результат возвращает первую строку. Вот вариант. Код: plaintext 1. 2. 3. 4. 5.
Но не расслабляйся. Чекай в дебаге с valgrind каждое подобное изменение кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 00:29 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Вот такой месседж должен быть всегда. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 00:31 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ Надо сделать строку и текста и нескольких переменных. Типа такой: "server=127.0.0.1 login=admin" 127.0.0.1 и admin взять из переменных. Самое простое, выделить приемный буфер в максимальный размер итоговой строки: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 04:53 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Когда-то давным-давно, когда Си был ещё Кернигана и Ричи, в нём существовали функции concat() и strrcpy(), которые делали в точности то, что ты хочешь. С тех пор их выпилили. Теперь рекомендуют С++: Код: sql 1.
надо имеено по Си, не С++ ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 10:28 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Alex_Ustinov Уткъ, printf выводит по шаблону сколько угодно аргументов, аргументы через запятую после Шаблона Код: plaintext 1.
Код: plaintext 1. 2. 3. 4.
Это-то понятно, но мне надо это склееную строку в коде еще использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 10:29 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Функциональный стиль в сях не работает обычно. Поэтому композицию нескольких кон-катов не получается сделать в каком-то достойном и безопасном стиле. Strcat как результат возвращает первую строку. Вот вариант. Код: plaintext 1. 2. 3. 4. 5.
Но не расслабляйся. Чекай в дебаге с valgrind каждое подобное изменение кода. Спасибо! Только на счет valgrind пока ничего не знаю. Я в блокнотике пишу код, потом копирую на сервер и компию через gcc. Тут наверное про ide какой-нить. Если как-то по-другому можно, скажите ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 10:32 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
White Owl Уткъ Надо сделать строку и текста и нескольких переменных. Типа такой: "server=127.0.0.1 login=admin" 127.0.0.1 и admin взять из переменных. Самое простое, выделить приемный буфер в максимальный размер итоговой строки: Код: plaintext 1. 2. 3. 4.
Функция sprintf используется для записи форматированной строки в буфер символьной строки. Похоже она как раз склеивает строку и это то что надо, спасибо! ...буду экспериментировать... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 10:34 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ Только на счет valgrind пока ничего не знаю. Я в блокнотике пишу код, потом копирую на сервер и компию через gcc. Тут наверное про ide какой-нить. Если как-то по-другому можно, скажите ) Если ты Windows девелопер то возможно там какие-то другие тулзы но смысл такой-же. Блокнот или IDE - это вопрос вкусов. Мой пример я написал в редакторе Atom. То что ты там что-то "копируешь на сервер" - вызывает удивление. В наше время, в эпоху виртуалок и докеров уже можно весь техно-стек компилляции создать на рабочем ноутбуке. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 11:45 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткънадо имеено по Си, не С++ Если пишешь для микроконтроллера - проверь-таки наличие в системных библиотеках функции strrcpy. Если нет - не парься и используй каскад strcat. Низкоуровневая оптимизация - пока что не твой уровень. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 14:12 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Уткъ Только на счет valgrind пока ничего не знаю. Я в блокнотике пишу код, потом копирую на сервер и компию через gcc. Тут наверное про ide какой-нить. Если как-то по-другому можно, скажите ) Если ты Windows девелопер то возможно там какие-то другие тулзы но смысл такой-же. Блокнот или IDE - это вопрос вкусов. Мой пример я написал в редакторе Atom. То что ты там что-то "копируешь на сервер" - вызывает удивление. В наше время, в эпоху виртуалок и докеров уже можно весь техно-стек компилляции создать на рабочем ноутбуке. Понял. Пока буду в блокноте писать. Нравится что никаких студий ставить не надо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 15:25 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Уткънадо имеено по Си, не С++ Если пишешь для микроконтроллера - проверь-таки наличие в системных библиотеках функции strrcpy. Если нет - не парься и используй каскад strcat. Низкоуровневая оптимизация - пока что не твой уровень. Это под линукс. Учту, спасибо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 15:25 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
А все же, как переменной присвоить значение непосредственно в программе? типа ip_var="127.0.1.1"; по идее sprintf присваивать может, но это для сложной строчки. А если совсем простое присваивание то как можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 15:27 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ, я не знаю что у тебя за компиллятор. Но попробуй так. Должно работать. Код: plaintext 1. 2. 3. 4. 5.
Присвоение указателю чего-то. Потом - пере-присвоение. Но в эти переменные уже нельзя будет конкатенировать потому что алоцировано ровно столько байтов сколько букв. Ну и +1 символ нуля "\0" (ASCIIZ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 15:35 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
White Owl Уткъ Надо сделать строку и текста и нескольких переменных. Типа такой: "server=127.0.0.1 login=admin" 127.0.0.1 и admin взять из переменных. Самое простое, выделить приемный буфер в максимальный размер итоговой строки: Код: plaintext 1. 2. 3. 4.
Тут sprintf тоже возвращает полезный результат. Можно его взять. Типа. Код: plaintext 1. 2. 3. 4.
Еще хорошо-бы избавиться от этого вредного буфера с размером (с хера-ли?) 1024. Псевдо-код. Печатам в пустоту. С подсчетом. Аллоцируем точный размер. И печатаем второй раз. Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 15:59 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Еще хорошо-бы избавиться от этого вредного буфера с размером (с хера-ли?) 1024. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
А если лень перечислять переменные - то массивы указателей и циклы спасут. А еще переменные можно оформить как va_list массив и vsnprintf() всегда к услугам. А любители С++ с его string+string могут написать себе расширение для strcat(): Код: plaintext 1. 2. 3. 4. 5. 6.
mayton Псевдо-код. Печатам в пустоту. С подсчетом. Аллоцируем точный размер. И печатаем второй раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 16:40 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
White Owl Код: plaintext 1.
Автору можно предложить varargs. Сколько у него там строк? 3 или 4. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 16:44 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
maytonПсевдо-код. Печатам в пустоту. С подсчетом. Аллоцируем точный размер. И печатаем второй раз. А что мешает печатать сразу второй раз куда нужно (и это "куда нужно" обычно таки не буфер в памяти)? Синдром Натальи Хлопотун?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 16:47 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Зришь в корень. Давай (в С++) постулируем алгебру ленивых строк. Что-б не конкатенировались вовсе. Вот такая у меня мысль. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 16:51 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Легко: Код: sql 1. 2.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 17:00 |
|
|
start [/forum/topic.php?fid=57&msg=40128891&tid=2017136]: |
0ms |
get settings: |
16ms |
get forum list: |
8ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
36ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
524ms |
get tp. blocked users: |
1ms |
others: | 2733ms |
total: | 3325ms |
0 / 0 |