У меня есть следующий код (на сервере [отправитель] программа):не Sprintf работает правильно, когда конкатенация Int и строки
#define PAYLOAD 256
//...some more code...
int l;
char packet[PAYLOAD];
char seqNumNpacket[sizeof(l) + sizeof(packet) + 1]; //to account for the number, space and the packet
FILE *fp2;
fp2 = fopen(req, "r");
l = 0;
char seqNumNpacket[sizeof(l) + sizeof(packet) + 1];
//... some more code...
n = fread(packet, 1, PAYLOAD, fp2);
packet[n] = '\0';
printf("%s", packet);
sprintf(seqNumNpacket, "%d %s", l, packet);
printf("%d %s", seqNumNpacket); //A
Здесь я пытаюсь прочитать байты из файла, а затем положить его вместе в строке с номером, чтобы я мог отправить его другому процессу, используя sendto()
/recvfrom
.
Проблема возникает, когда я использую sprintf
, чтобы соединить их. Почему-то вместо написания строки «seqNum
packet
« это заканчивается как «seqNum
packet
seqNUm
».
У меня нет ни малейшего понятия, что вызывает это, и поэтому не нашли способ его решить. Спасибо за помощь заранее с этим глупый вопрос.
'sizeof (l)' не имеет ничего общего с количеством символов, которое будет иметь представление strnig целого. Кроме того, не смешивайте объявления с операторами и не 'fread()' перед проверкой, если 'fp2 == NULL'. –
Я сделал это, потому что по умолчанию это 4 байта, что избавляет меня от попыток угадать, сколько символов будет 'l', что упростит в момент конкатенации. Все еще не слишком уверен, как это меняет ситуацию. Спасибо за другие предложения по стилю кодирования. – Yokhen
Я не понимаю вашего комментария, '10000' может быть представлен с 32-битным целым числом и имеет более 4 символов, количество байтов, которое использует целое число, не имеет никакого отношения к количеству байтов, которое ему требуется для строкового представления. –