2013-08-26 2 views
6

по сети: с помощью printf сложить два числа (без использования оператора), как следующее:Сложение с использованием Printf в C

main() 
{ 
    printf("Summ = %d",add(10,20)) 
    return 0; 
} 

int add(int x,int y) 
{ 
    return printf("%*d%*d",x,' ',y,' '); 
} 

Может кто-нибудь, пожалуйста, объясните, как это работает:

return printf("%*d%*d",x,' ',y,' '); 

Примечание : Это терпит неудачу, когда я называю "сумма", как следующее:

sum(1,1) or sum(3,-1) 
+0

Не знаю ... Почему это не работает для каждого входа ... например, «sum (1,1)». Нужно ли мне модифицировать код для каждого и каждый вход.Если это так, то эта логика неверна. – bapi

+0

Я бы пошел с 'char dummy; return snprintf (& dummy, 1, "% * s% * s", x, "", y, ""); вместо этого избегать бесполезного вывода. – nneonneo

+0

Ваша функция в верхнем коде - 'add'. Тогда ваш вопрос о функции 'sum'. Это * разные * функции. – abelenky

ответ

1

Во-первых, printf возвращается количество напечатанных символов.

Во-вторых, в спецификаторе формата %*d, * означает минимальное количество символов для печати, но ширина не относится к самой строке формата, а из дополнительного аргумента.

Со всеми вместе, дело сделано, но это не будет хорошо работать на небольших количествах, как 1 из %d в спецификатор формата, лучшим решением может быть:

("%*c%*c", a, ' ', b,' '); 
8

Есть два центральных концепции здесь:

  1. printf() возвращает количество напечатанных символов.
  2. Спецификатор формата %*d вызывает printf(), чтобы прочитать два целых числа из его аргументов и использовать первый, чтобы установить ширину поля, используемую для форматирования второй (в виде десятичного числа).

Таким образом, значения, добавляемые, используются в качестве ширины поля, а printf() затем возвращает сумму.

Я не уверен в фактическом d форматировании символа пробега на данный момент. Это выглядит странно, я бы пошел с пустой строкой вместо:

static int sum(unsigned int a, unsigned int b) 
{ 
    return printf("%*s%*s", a, "", b, ""); 
} 

int main(void) 
{ 
    unsigned int a = 13, b = 6; 
    int apb = sum(a, b); 

    printf("%d + %d = %d?\n", a, b, apb); 

    return 0; 
} 

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

+0

@cHao Ну конечно, но, конечно, я тоже напечатал его как строку, с '' '. См. Код. Я просто думаю, что это яснее. – unwind

+0

Да, видел обновление. Это имеет больше смысла. :) – cHao

+1

Ну, '' '' '' int', поэтому форматирование '% d' напечатает' 32'. А так как ширина поля минимальна (это означает, что выход не будет усечен, если он больше указанной ширины), 'add (1,1)' будет возвращать '4'. Таким образом, ваше решение с '% * s' и' '" 'намного лучше (хотя трюк не будет работать с отрицательными номерами, конечно). – Virgile

2

printf возвращает количество печатных знаков.

Здесь он используется в функции add, чтобы сгенерировать строку, состоящую только из 10 + 20 пробелов, используя строку формата.

Таким образом, printf в функции add вернет 30.

Затем этот результат просто печатается с помощью printf (его основная цель).

Примечание: это может быть очевидно, но этого следует избегать использования printf. Он очень грязный, поскольку он генерирует бесполезные результаты. Представьте себе: add(10000,10000) ...

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