2013-08-17 4 views
0

У меня ошибка сегментации в моей программе. Вот мой кодОшибка сегментации sprintf()

char buffer[5000]=""; 
memset(buffer,0,sizeof(buffer)); 
sprintf(buffer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\ 
         <soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:log=\"http://wsdlclass.wsdlcreat.sims.triesten.com\">\ 
         <soap:Header>\ 
         </soap:Header>\ 
         <soap:Body>\ 
         <log:saveMessBillingDetails>\ 
         <log:userId>%s</log:userId>\ 
         <log:billNo>%s</log:billNo>\ 
      <log:billingAmount>%s</log:billingAmount>\ 
      <log:billingDate>%s</log:billingDate>\ 
      <log:messId>%s</log:messId>\ 
      <log:itemId>%s</log:itemId>\ 
      <log:ipAddress>%s</log:ipAddress>\ 
      <log:schoolId>%s</log:schoolId>\ 
         </log:saveMessBillingDetails>\ 
         </soap:Body>\ 
      </soap:Envelope>", 
    "00007", "152555", "42.00", "17-08-2013", 10, "CHKK", "10.10.1.164", 1); 
+1

В дополнение к ошибке% s //% d: 1) memset() бесполезен 2) Я настоятельно рекомендую использовать snprintf() вместо этого и проверить его возвращаемое значение 3) для больших s [n] printf () вызывает такой код, код может быть упрощен для чтения и обслуживания, разделив вызов snprintf() на несколько вызовов на snprintf() – wildplasser

+2

Пожалуйста, не изменяйте вопрос до нужной версии. Люди могут задаться вопросом, что такое ошибка. –

+1

FYI: Я вернул его к предыдущей версии. – wildplasser

ответ

6

При использовании *printf*() семейства функций вам необходимо позаботиться о том, номер и типа спецификаторов преобразований совпадают с аргументами, после формата «строки».

Это не так в вызове sprintf(), так как есть только "%s", где как и целые числа (которые требуют "%d") пропускаются. Однако число аргументов является правильным.

Update:

правильны и безопасная версия кода может быть:

char buffer[5000]=""; 
int printed = snprintf(buffer, sizeof(buffer), "<?xml version=\"1.0\" encoding=\"utf-8\"?>\ 
    <soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:log=\"http://wsdlclass.wsdlcreat.sims.triesten.com\">\ 
    <soap:Header>\ 
    </soap:Header>\ 
    <soap:Body>\ 
    <log:saveMessBillingDetails>\ 
    <log:userId>%s</log:userId>\ 
    <log:billNo>%s</log:billNo>\ 
    <log:billingAmount>%s</log:billingAmount>\ 
    <log:billingDate>%s</log:billingDate>\ 
    <log:messId>%d</log:messId>\ 
    <log:itemId>%s</log:itemId>\ 
    <log:ipAddress>%s</log:ipAddress>\ 
    <log:schoolId>%d</log:schoolId>\ 
    </log:saveMessBillingDetails>\ 
    </soap:Body>\ 
    </soap:Envelope>", 
    "00007", "152555", "42.00", "17-08-2013", 10, "CHKK", "10.10.1.164", 1); 

    if (printed >= sizeof(buffer)) 
    fprintf(stderr, "The target buffer was to small.\n"); 
+0

Да, у меня есть целое число. извините, отредактировал его сейчас Если у меня есть целое число, которое я использую. пожалуйста посоветуй. –

+0

@Krish: Пожалуйста, см. Мой ответ, я упомянул об этом там. Также чтение 'man 3 printf' может помочь получить просветление. – alk

+0

@Krish: Это не очень хорошая идея исправить источники здесь, в SO после того, как они финансируют ошибки **. Это затрудняет понимание абзацев/дискуссий. – alk

3

Изменение 10 и 1 к "10" и "1", поскольку соответствующие преобразования спецификаторов из sprintf являются %s который ожидает строки ,

Или вы можете изменить соответствующие спецификации от %s до %d.

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