|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#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 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Вот чорт. Я написал в С++? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 17:06 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
То же самое в С: Код: sql 1. 2. 3. 4. 5.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 17:09 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Семантически - это не совсем то. Я ведь хотел использовать этот бутерброд из строк многократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 17:19 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Если настолько хочется ленивых извращений, то можно взять https://github.com/herumi/xbyak и генерировать функции, которые будут генерировать нужные строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 17:47 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
только что хотел полазить в исходниках MySQL.... заглянул в этот топик и устал, надо отдохнуть ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 19:18 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Вот же нафлудили на ровном месте. memcpy() достаточно для C, ни один компилятор не ругнется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 21:01 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Всего две проблемы с ним: 1) Надо вычислять длину присобачиваемой строки; 2) Возвращает он опять же dest. То есть выигрыша по скорости - полный нуль. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 23:25 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Уткъ, я не знаю что у тебя за компиллятор. Но попробуй так. Должно работать. Код: plaintext 1. 2. 3. 4. 5.
Присвоение указателю чего-то. Потом - пере-присвоение. Но в эти переменные уже нельзя будет конкатенировать потому что алоцировано ровно столько байтов сколько букв. Ну и +1 символ нуля "\0" (ASCIIZ) Объявил как вы написали, только без присваивания: Код: plaintext 1.
, значение присвоилось нормально: Код: plaintext 1.
Более того, сложение строк отработало корректно: Код: plaintext 1.
Я очень рад, большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 06:08 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Не бери за чистую монету. Проверяй меня. Сомневайся. В первом и втором присвоении было присвоение не значения а указателя. Для изучающих, главная сложность С/C++ - это работа с указателями и контроль над памятью. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 11:16 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Смотрите, вот так объявил: Код: plaintext 1. 2.
вот так присвоил: Код: plaintext 1.
вот так складывается нормально: Код: plaintext 1.
Но. Если объявить так: Код: plaintext 1. 2.
присвоить Код: plaintext 1. 2.
то Код: plaintext 1.
вызывает Segmentation fault Подскажите пожалуйста, как зарезервировать память для str_var чтобы к ней присоединилась еще одна строка? читаю про malock, думаю как-то с помощью её, но как пока не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 13:52 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ читаю про malock, думаю как-то с помощью её, но как пока не понял. Все верно, надо malloc(), читай внимательней. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:02 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Dima T Уткъ читаю про malock, думаю как-то с помощью её, но как пока не понял. Все верно, надо malloc(), читай внимательней. ну смотрите, выделяю при обявлении char *str_var=(char *)malloc(10000); все равно Segmentation fault 10 000 символов по идее сильно больше чем строка... Скажите, как-то по-другому надо выделять? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:07 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ Скажите, как-то по-другому надо выделять? Все правильно выделено. Только после надо убедится что память была выделена и показать последующий код на котором вылетает. Если такой код Код: plaintext 1. 2. 3. 4.
то это утечка памяти, т.к. теряется указатель на выделенную память. "server=" надо копировать в str_var ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:15 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Утк. Показывай целый исходник. А то так непонятно когда ты выделяешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:15 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ, после выделения malloc, память содержит мусор - ее надо зачистить. можно использовать calloc, можно просто прописать 0, чтобы strcat знал, что строка пустая str_var[0] = 0; ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:16 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Утк. Показывай целый исходник. А то так непонятно когда ты выделяешь. Вот весь исходник: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:23 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Siemargl Уткъ, после выделения malloc, память содержит мусор - ее надо зачистить. можно использовать calloc, можно просто прописать 0, чтобы strcat знал, что строка пустая str_var[0] = 0; Прописал str_var[0] = 0; перед str_var = "server="; ошибка осталась . malloc заменил на calloc не скомпилилось, с calloc разбираться надо, пока не дошел до него. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:28 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Dima T ААА!!! вот так сработало!!! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:31 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
Уткъ, теперь сбоя сегментации нет но есть утечка. Обычно после того как попользовались памятью - ее удаляют. Вот так. Код: plaintext 1. 2. 3.
В main функции это прокатило потому что это одноразовый вызов и ОС после этого делает зачистку памяти но в другом кейсе где будет цикл ты переполнишь память бесполезными аллокациями. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:38 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton Уткъ, теперь сбоя сегментации нет но есть утечка. Обычно после того как попользовались памятью - ее удаляют. Вот так. Код: plaintext 1. 2. 3.
В main функции это прокатило потому что это одноразовый вызов и ОС после этого делает зачистку памяти но в другом кейсе где будет цикл ты переполнишь память бесполезными аллокациями. Да, надо все делать аккуратно ;) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 14:42 |
|
Си объеденить более двух строк.
|
|||
---|---|---|---|
#18+
mayton? так а где вывод от Гуру? куда делось ip_var? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2022, 22:58 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017136]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 413ms |
0 / 0 |