powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си объеденить более двух строк.
22 сообщений из 47, страница 2 из 2
Си объеденить более двух строк.
    #40129106
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То же самое в С:
Код: sql
1.
2.
3.
4.
5.
FILE* f = fopen("\\\\.\\pipe\\svc", "w");
fputs(f, "server=");
fputs(f, ip_var);
fputs(f, " login=");
fputs(f, login_var);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129112
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семантически - это не совсем то. Я ведь хотел использовать этот бутерброд из строк многократно.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129133
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если настолько хочется ленивых извращений, то можно взять https://github.com/herumi/xbyak и генерировать функции, которые будут генерировать нужные строки.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129153
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только что хотел полазить в исходниках MySQL....
заглянул в этот топик и устал, надо отдохнуть
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129165
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот же нафлудили на ровном месте. memcpy() достаточно для C, ни один компилятор не ругнется.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129177
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всего две проблемы с ним:
1) Надо вычислять длину присобачиваемой строки;
2) Возвращает он опять же dest.

То есть выигрыша по скорости - полный нуль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129187
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ, я не знаю что у тебя за компиллятор. Но попробуй так. Должно работать.

Код: plaintext
1.
2.
3.
4.
5.
char *ip_var = "127.0.0.1";

....

ip_var = "192.168.0.1";


Присвоение указателю чего-то. Потом - пере-присвоение.

Но в эти переменные уже нельзя будет конкатенировать потому что алоцировано
ровно столько байтов сколько букв. Ну и +1 символ нуля "\0" (ASCIIZ)


Объявил как вы написали, только без присваивания:
Код: plaintext
1.
char *ip_var;



, значение присвоилось нормально:


Код: plaintext
1.
ip_var = "192.168.0.1";




Более того, сложение строк отработало корректно:
Код: plaintext
1.
strcat(str_var, ip_var);





Я очень рад, большое спасибо!
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129225
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не бери за чистую монету. Проверяй меня. Сомневайся.

В первом и втором присвоении было присвоение не значения а указателя.

Для изучающих, главная сложность С/C++ - это работа с указателями и контроль над памятью.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129273
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотрите, вот так объявил:

Код: plaintext
1.
2.
char str_var[1024] = "server=";
char *ip_var;





вот так присвоил:

Код: plaintext
1.
ip_var = "192.168.0.1";






вот так складывается нормально:

Код: plaintext
1.
strcat(str_var, ip_var);









Но.

Если объявить так:

Код: plaintext
1.
2.
char *str_var;
char *ip_var;



присвоить

Код: plaintext
1.
2.
str_var = "server=";
ip_var = "192.168.0.1";




то
Код: plaintext
1.
strcat(str_var, ip_var);




вызывает

Segmentation fault





Подскажите пожалуйста, как зарезервировать память для str_var чтобы к ней присоединилась еще одна строка?


читаю про malock, думаю как-то с помощью её, но как пока не понял.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
читаю про malock, думаю как-то с помощью её, но как пока не понял.

Все верно, надо malloc(), читай внимательней.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129280
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
читаю про malock, думаю как-то с помощью её, но как пока не понял.

Все верно, надо malloc(), читай внимательней.



ну смотрите, выделяю при обявлении

char *str_var=(char *)malloc(10000);




все равно

Segmentation fault

10 000 символов по идее сильно больше чем строка...

Скажите, как-то по-другому надо выделять?
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129282
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Скажите, как-то по-другому надо выделять?

Все правильно выделено. Только после надо убедится что память была выделена и показать последующий код на котором вылетает.

Если такой код
Код: plaintext
1.
2.
3.
4.
char *str_var=(char *)malloc(10000);
str_var = "server="; // потеря указателя на выделенную память
ip_var = "192.168.0.1";
strcat(str_var, ip_var); // тут Segmentation fault


то это утечка памяти, т.к. теряется указатель на выделенную память. "server=" надо копировать в str_var
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129284
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Утк. Показывай целый исходник. А то так непонятно когда ты выделяешь.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129285
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ,

после выделения malloc, память содержит мусор - ее надо зачистить.
можно использовать calloc, можно просто прописать 0, чтобы strcat знал, что строка пустая str_var[0] = 0;
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129286
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Утк. Показывай целый исходник. А то так непонятно когда ты выделяешь.




Вот весь исходник:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int
main()
{
char *str_var=(char *)malloc(10000);
char *ip_var;

str_var = "server="; // потеря указателя на выделенную память
ip_var = "192.168.0.1";

strcat(str_var, ip_var); // тут Segmentation fault

printf("str_var: %s\n", str_var);

    return 0;
}
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Вот весь исходник:

22425747
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129288
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl
Уткъ,

после выделения malloc, память содержит мусор - ее надо зачистить.
можно использовать calloc, можно просто прописать 0, чтобы strcat знал, что строка пустая str_var[0] = 0;




Прописал


str_var[0] = 0;



перед



str_var = "server=";




ошибка осталась .


malloc заменил на calloc не скомпилилось, с calloc разбираться надо, пока не дошел до него.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129290
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Вот весь исходник:

22425747



ААА!!!


вот так сработало!!!


Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int
main()
{
char *str_var=(char *)malloc(10000);
char *ip_var;


str_var[0] = 0;

strcat(str_var, "server="); 


ip_var = "192.168.0.1";

strcat(str_var, ip_var); // тут Segmentation fault

printf("str_var: %s\n", str_var);

    return 0;
}




Спасибо!!!
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ, теперь сбоя сегментации нет но есть утечка. Обычно после того как попользовались памятью - ее удаляют.

Вот так.

Код: plaintext
1.
2.
3.
char *str_var=(char *)malloc(10000);
......
free(str_var);



В main функции это прокатило потому что это одноразовый вызов и ОС после этого делает зачистку памяти
но в другом кейсе где будет цикл ты переполнишь память бесполезными аллокациями.
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129296
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ, теперь сбоя сегментации нет но есть утечка. Обычно после того как попользовались памятью - ее удаляют.

Вот так.

Код: plaintext
1.
2.
3.
char *str_var=(char *)malloc(10000);
......
free(str_var);



В 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int
main()
{
char *str_var=(char *)malloc(10000);
char *ip_var;


str_var[0] = 0;

strcat(str_var, "server="); 


ip_var = "192.168.0.1";

strcat(str_var, ip_var); // тут Segmentation fault

printf("str_var: %s\n", str_var);

free(str_var);

    return 0;
}
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129440
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton?

так а где вывод от Гуру?
куда делось ip_var?
...
Рейтинг: 0 / 0
Си объеденить более двух строк.
    #40129522
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При рассмотрении работы с указателем надо рассматривать собственно указатель и ту память на которую он указывает.
Как-бы две разные сущности у которых lifecycle не обязательно должен совпадать.
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си объеденить более двух строк.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]