2015-12-04 4 views
-2

У меня есть следующий код (на сервере [отправитель] программа):не 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, чтобы соединить их. Почему-то вместо написания строки «seqNumpacket« это заканчивается как «seqNumpacketseqNUm».

У меня нет ни малейшего понятия, что вызывает это, и поэтому не нашли способ его решить. Спасибо за помощь заранее с этим глупый вопрос.

+2

'sizeof (l)' не имеет ничего общего с количеством символов, которое будет иметь представление strnig целого. Кроме того, не смешивайте объявления с операторами и не 'fread()' перед проверкой, если 'fp2 == NULL'. –

+0

Я сделал это, потому что по умолчанию это 4 байта, что избавляет меня от попыток угадать, сколько символов будет 'l', что упростит в момент конкатенации. Все еще не слишком уверен, как это меняет ситуацию. Спасибо за другие предложения по стилю кодирования. – Yokhen

+0

Я не понимаю вашего комментария, '10000' может быть представлен с 32-битным целым числом и имеет более 4 символов, количество байтов, которое использует целое число, не имеет никакого отношения к количеству байтов, которое ему требуется для строкового представления. –

ответ

2
  1. Самая важная проблема с кодом это

    n = fread(packet, 1, PAYLOAD, fp2); 
    

    , даже если вы используете его правильно, следующая строка

    packet[n] = '\0'; 
    

    может быть неправильным, потому что если n == PAYLOAD это будет напишите 1 байт после окончания массива packet, вы должны прочитать следующее:

    n = fread(packet, 1, PAYLOAD - 1, fp2); 
    

    Если вы исправите это, проблема может исчезнуть, потому что похоже, что массив packet не имеет терминатора 8 вашего результата.

  2. Вторая очень важная проблема: используется sizeof(int) для строкового представления целого числа.

+0

или если размер полезной нагрузки может быть важен, увеличьте размер буфера на 1 –

+0

@ M.M Думаю, я могу это сделать @iharob Большое спасибо. Я изменил его, используя 'asprintf', и он работал^_ ^, может ли сила быть с вами. – Yokhen

Смежные вопросы