2013-08-26 8 views
6

su rete: utilizzando printf aggiungere due numeri (senza l'utilizzo di qualsiasi operatore) come segue:addizione utilizzando printf in C

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

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

Qualcuno potrebbe spiegare, come funziona:

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

Nota : Questo non è riuscita quando io chiamo "somma", come segue:

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

Non so ... Perché questo non funziona per ogni input ... per esempio "sum (1,1)" .. Devo modificare il codice per ogni e ogni input.Se questo è il caso, allora questa logica è sbagliata. – bapi

+0

Sarei andato con 'char dummy; return snprintf (& dummy, 1, "% * s% * s", x, "", y, ""); 'invece di evitare output inutili. – nneonneo

+0

La tua funzione nel codice superiore è 'add'. Quindi la tua domanda riguarda la funzione 'sum'. Queste sono * diverse * funzioni. – abelenky

risposta

1

In primo luogo, i rendimenti printf il numero di caratteri che stampa.

Secondo, nell'identificatore di formato %*d, * indica il numero minimo di caratteri da stampare, ma la larghezza non proviene dalla stringa di formato stessa, ma dall'argomento aggiuntivo.

Con tutti insieme, il lavoro è fatto, ma non funziona bene su piccoli numeri come 1 a causa della %d in di formato, una soluzione migliore potrebbe essere:

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

ci sono due centrali concetti qui:

  1. printf() restituisce il numero di caratteri stampati.
  2. L'identificatore di formato %*d causa printf() per leggere due interi dai relativi argomenti e utilizzare il primo per impostare la larghezza del campo utilizzata per formattare il secondo (come numero decimale).

Quindi i valori aggiunti vengono utilizzati come larghezze di campo e printf() restituisce la somma.

Non sono sicuro della formattazione attuale dello d del carattere spazio. Che sembra strano, sarei andato con una stringa vuota invece:

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; 
} 

Le opere di cui sopra e calcola correttamente la somma come 19.

+0

@cHao Ben sicuro, ma ovviamente lo stamperei anche come stringa, con 's'. Vedi il codice. Penso solo che sia più chiaro. – unwind

+0

Sì, ho visto l'aggiornamento. Questo ha più senso. :) – cHao

+1

Bene, '''' è un 'int', quindi la formattazione'% d' stamperà '32'. E poiché la larghezza del campo è minima (il che significa che l'output non verrà troncato se è maggiore della larghezza specificata), 'add (1,1)' restituirà '4'. La tua soluzione con '% * s' e' "" 'è quindi molto meglio (anche se il trucco non funzionerà ovviamente con numeri negativi). – Virgile

2

printf restituisce il numero di caratteri stampati.

Qui, viene utilizzato nella funzione add per generare una stringa composta solo da 10 + 20 spazi, utilizzando la stringa di formato.

Quindi la funzione printf nella funzione add restituirà 30.

Quindi, questo risultato viene semplicemente stampato con printf (il suo scopo principale).

Nota: potrebbe essere evidente, ma questo utilizzo di printf deve essere evitato. È molto sporco in quanto genera uscite inutili. Immaginate: add(10000,10000) ...