С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 140

Int в char* так еще и с нолем-терминатором

04.09.2021, 21:40. Показов 8759. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вобщем есть такой код
C++
1
2
int msg_size;
recv(connection,(char*)&msg_size,sizeof(msg_size),  NULL);
И при его выполнение все работает , но нуль-терминатор в конце не ставиться так как хватает только на данные msg_size. Вопрос как получить нуль-терминатор в конце char* ? Иначе без этого это пакет путаеться с другими.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2021, 21:40
Ответы с готовыми решениями:

Как в выделенную память записать поочередно число int, массив char[n], и еще число int
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char, и еще число int?

Ошибка: cannot convert 'int (*)[50]' to 'int*' for argument '1' to 'void vvod2m(int*, int*, int*, char)'Х2
Матрицы An1*m1 и Bn2*m2 вводить с клавиатуры (размерности >3, m1=n2). Выполнять через подпрограммы. выводит следующие ошибки: 1) cannot...

Подставить работающий код в функцию bool define(char * s1, int size1, char * s2, int size2)
Помогите пожалуйста решить, я уже решил используя стринг но надо использовать char* s1 и подставить под ту функцию Код работает идеально...

10
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,017
04.09.2021, 21:53
qwaz, в int не бывает никаких нуль-терминаторов. Вопрос непонятен. Нужно вставлять разделители при отправке, а на приёме вычитывать в буфер поток, затем анализировать, отбрасывая найденный в начале потока мусор (если стало понятно, что это мусор)
0
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 140
05.09.2021, 05:47  [ТС]
Ну тогда вот так.Пакеты разделяються автоматически по \0 мне нужно именно его добааить в char*.А анализировать мусор ,вставлять спец.символы - слишком сложно.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.09.2021, 07:48
читайте в массив char, потом в int уже пихайте.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,017
05.09.2021, 09:11
Цитата Сообщение от qwaz Посмотреть сообщение
его добааить в char*.
не надо ни в какой char* ничего добавлять, нужен массив с uint8_t, а ещё лучше std::vector<uint8_t>
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.09.2021, 09:41
Цитата Сообщение от Алексей1153 Посмотреть сообщение
не надо ни в какой char* ничего добавлять, нужен массив с uint8_t, а ещё лучше std::vector<uint8_t>
https://wandbox.org/permlink/1blVaoOWasPxVdxK
0
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 140
05.09.2021, 12:36  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
читайте в массив char, потом в int уже пихайте.
Можно код для примера какой-нибудь?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.09.2021, 15:34
Цитата Сообщение от qwaz Посмотреть сообщение
Можно код для примера какой-нибудь?
если правильно понял.
C++
1
2
3
4
uint32_t res = 0;
char msg[sizeof(res) + 1] = {}; // 4 - int, 1 - \0
recv(sock, msg, sizeof(msg), 0);
memcpy(&res, msg, sizeof(res));
0
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 140
05.09.2021, 16:00  [ТС]
Вообщем я так ничего и не понял вот код.При запуске и отправки сообщений печатается рандомные символы.
Сервер
C++
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <winsock2.h>
#include <cstdio>
#include <cstring>
 
SOCKET Connections[100],sServer;
int Counter = 0;
char nicks[100][20];
 
void ClientHandler(int index)
{
    char nick[20];
    int msg_size;
    
    for (int i = 0; i < strlen(nicks[index]); i++)
    {
        nick[i] = {nicks[index][i]};
    }
    nick[strlen(nick)] = ':';
    nick[strlen(nick) + 1] = '\0';
    while (true) {
        recv(Connections[index], (char*)&msg_size, sizeof(int), NULL);
        char *msg = new char[msg_size + 1];
        msg[msg_size] = '\0';
        recv(Connections[index], msg, msg_size, NULL);
        for (int i = 0; i < Counter; i++)
        {
            if (i == index)
            {
                continue;
            }
            if(strcmp(msg,"") == 0)
            {
                break;
            }
            send(Connections[i],(char*)&msg_size,sizeof(int),NULL);
            send(Connections[i],nick,sizeof(nick),NULL);
            send(Connections[i],msg,msg_size,NULL);
        }
        delete[] msg;
    }
}
 
 
int main(){
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2,1);
    if(WSAStartup(DLLVersion,&wsaData) != 0){
        printf("erorr");
        exit(1);
    }
 
    printf("[DLL_LOADED]\n");
 
    SOCKADDR_IN localaddr,claddr;
    sServer = socket(AF_INET, SOCK_STREAM, NULL);
 
    int sizeofaddr = sizeof(localaddr);
    localaddr.sin_addr.s_addr = INADDR_ANY;
    localaddr.sin_port = htons(2682);
    localaddr.sin_family = AF_INET;
 
    printf("[ADDRES_MAKED]\n");
 
    
    bind(sServer, (struct sockaddr *)&localaddr, sizeof(localaddr));
    listen(sServer, SOMAXCONN);
 
    printf("[PORT_BINDED]\n");
 
    SOCKET newConnection;
    for (int i = 0; i < 100; i++)
    {
        newConnection = accept(sServer, (SOCKADDR*)&claddr, &sizeofaddr);
 
        if(newConnection == 0) {
            printf("error2");
        }
        else {
            printf("[NEW_USER_CONNECTED]\n");
        } 
        
        Connections[i] = newConnection;
        recv(Connections[i], nicks[i], sizeof(nicks[i]), NULL);
        printf("[USERNAME:%s]\n", nicks[i]);
        printf(
            "[IP: %u.%u.%u.%u]\n",
            claddr.sin_addr.S_un.S_un_b.s_b1,
            claddr.sin_addr.S_un.S_un_b.s_b2,
            claddr.sin_addr.S_un.S_un_b.s_b3,
            claddr.sin_addr.S_un.S_un_b.s_b4
            );
 
        Counter++;
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, (LPVOID)(i), NULL, NULL);
    }
    system("pause");
 
    return 0;
}
Клиент
C++
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <winsock2.h>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <string>
#include <iostream>
 
using namespace std;
SOCKET Connection;
 
int iseed;
int d = 143;
char a[143];
char b[143];
 
template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
 
/*void gnrt_alp()
{
    for (int i=0; i < d; i++){         
        a[i] = 'a' + i;
    }
}
 
void gnrt_sh () {
    strcpy(b,a);
    srand(*iseed);
    for (int i=d-1; i>0; i--) {
        swap(b[i], b[rand() %i]);
    }
    for (int i=0; i<d-1; i++) { 
        if (b[i] == 'a'+i){
            swap(b[i], b[i+1]);
        }
    }
}
 
void s_send (char msg[256],int msglen) {
    char islovo[256];
    int i = 0;
    int k = 0;
    while (k <= msglen){
        while(i <= strlen(a) + 1){
            if(a[i] == msg[k]){
                islovo[k] = b[i];
                break;
            }
            else if(a[i] != msg[k]){
                islovo[k] = msg[k];
            }
            i++;
        }
        i = 0;
        k++;
    }
    send(Connection,islovo,sizeof(islovo),NULL);
}*/
 
void ClientHandler () {
    int msg_size;
    char nick[256];
    char islovo[256];
    int i = 0;
    int k = 0;
    while (true)
    {
        recv(Connection,(char*)&msg_size,sizeof(int),NULL);
        char *msg = new char[msg_size + 1];
        msg[msg_size] = '\0';
        recv(Connection,nick,sizeof(nick),NULL);
        recv(Connection,msg,msg_size,NULL);
        printf("%s\n",nick);
        printf("%s\n",msg);
        /*while (k <= strlen(msg)){
            while(i <= strlen(b) + 1){
                if(b[i] == msg[k]){
                    islovo[k] = msg[i];
                    break;
                }
                else if(b[i] != msg[k]){
                    islovo[k] = msg[k];
                }
                i++;
            }
            i=0;
            k++;
        }
        printf("%s\n", islovo);
        k = 0;*/
        delete[] msg;
    } 
}
 
int main(){
    char ipa[15];
    int port[6];
    char nick[256];
    char seed[20];
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2,1);
    if(WSAStartup(DLLVersion,&wsaData) != 0){
        printf("erorr");
        exit(1);
    }
 
    printf("Enter ip: ");
    scanf("%s",ipa);
    printf("Enter nickname: ");
    scanf("%s",nick);
    /*printf("Enter seed(max 20):");
    scanf("%s",seed);
    iseed = *(int*)seed;*/
 
    SOCKADDR_IN addr;
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr(ipa);
    addr.sin_port = htons(2682);
    addr.sin_family = AF_INET;
 
    Connection = socket(AF_INET, SOCK_STREAM, NULL);
    if(connect(Connection,(SOCKADDR*)&addr,sizeof(addr)) != 0) {
        printf("error failed connect to server");
        exit(1);
    };
    printf("[CONNECTED]\n");
    
    send(Connection,nick,sizeof(nick),NULL);
    /*gnrt_alp();
    printf("%s",a);
    gnrt_sh();
    printf("%s",b);
    Sleep(100);*/
 
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, NULL, NULL, NULL);
 
    std::string msgl;
    while (true)
    {
        std::getline(std::cin,msgl);
        int msg_size = msgl.size();
        send(Connection,(char*)&msg_size,sizeof(int),NULL);
        send(Connection,msgl.c_str(),msg_size,NULL);
        _sleep(20);
    }
    system("pause");
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.09.2021, 16:25
Лучший ответ Сообщение было отмечено qwaz как решение

Решение

На сервере записываете nick из 20-ти байт, а на клиенте считываете 256
1
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 140
06.09.2021, 06:48  [ТС]
Cпасибо большое!Я бы еще очень долго еще мучился.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.09.2021, 06:48
Помогаю со студенческими работами здесь

Написать функцию char numtos ( int num ), преобразующую число int в char
Написать функцию char *numtos ( int num ), преобразующую число типа int в его цифровую запись str (возможен ведущий знак ‘+’ или ‘-‘).

Реализация функции char *padl(const char *string, int len, int c=' ')
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Error C2040:strnset_2:"char *(char *,int,unsigned int)" отличается по уровням косвенного обращения от "int ()"
Не могу найти в чём ошибка. error C2040: strnset_2: &quot;char *(char *,int,unsigned int)&quot; отличается по уровням косвенного обращения от...

как осуществить приведение типов....(int) char ; (char) int;
Подскажите пожалуйста. мне нужно перевести программу с билдера на дельфи. Есть некоторые нюансы. 1) как осуществить приведение...

написать, прогу которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах
Написать желательно простейшим языком(без применения каких-то очень навороченных функций). Помогите, плиз


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru