2016-05-06 6 views
-1

Ich komme zu C nach langer Zeit nicht zu verwenden. Ich habe gerade geübt und bin auf dieses Problem gestoßen. Ich versuche zu:Teilen Code in Funktionen in C

  1. nehmen 2 Variablen von scanf()
  2. die beiden Eingänge multiplizieren
  3. dann gibt das Problem

Ich habe versucht, die verschiedenen Teile in Funktionen aufgeteilt, aber das Programm gibt verrückte hohe Zahlen (denke, dass sie die Speicheradressen sind). Es liegt wahrscheinlich an meinem Mangel an Missverständnissen.

#include <stdio.h> 

int input(); 
int mult (int x, int y); 

int main() 
{ 
int x; 
int y; 

x, y = input(); 

printf("In Main: x, y: %d, %d\n", (x, y)); 
z = mult(x,y); 
printf("The product of your two numbers is %d\n", z); 

getchar(); 
getchar(); 
} 


int input() 
{ 
int i_x; 
int i_y;  

printf("Please input two numbers to be multiplied: "); 
scanf("%d", &i_x); 
scanf("%d", &i_y); 
printf("In Input: x, y: %d, %d\n", i_x, i_y); 
return i_x, i_y; 
} 


int mult (int x, int y) 
{ 
int a; 
int b; 
int c; 

a = x; 
b = y; 

printf("In Multi: x, y: %d, %d\n", a, b); 

c = a*b; 

return c; 
} 

Antwort

3

x, y = input(); nicht tun, was Sie erwarten. Sie können nicht zwei Werte von einer Funktion zurückgeben. Sie sollten über comma operator lesen.

Ich würde eher vorschlagen, die Adresse x und y an die Funktion input übergeben. Ändern Prototyp erste

void input(int *, int *);  

dann nennen es als

input(&x, &y); 

und ändern Sie die Definition

void input(int *i_x, int *i_y) 
{ 
    printf("Please input two numbers to be multiplied: "); 
    scanf("%d", i_x); 
    scanf("%d", i_y); 
    printf("In Input: x, y: %d, %d\n", *i_x, *i_y); 
} 
+0

@ElliottCooper; Sie sollten über Zeiger lesen. – haccks

+0

danke das ist wirklich hilfreich. nur ein wenig verwirrt. Im neuen Code sagt man also effektiv: * i_x = & x; (was ich verstehe) aber ich verstehe scanf nicht ("% d", i_x); Sicher wollen Sie scanf ("% d", * i_x) sagen, weil * i_x auf den Wert von x zeigt. Entschuldigung, kannst du bitte etwas weiter expandieren? –

0

main sollte einen Wert zurückgeben, da es als int definiert ist.
return i_x, i_y; wird nur i_y durch die Definition der [comma operator] zurückgegeben. Mit derselben Definition wird x, y = input(); nur y zugewiesen.

0

Wie von @hacks gezeigt, funktioniert die Zuweisung von x & y durch Aufruf von input() nicht richtig. Die Variable x wird nur einen unitären Junk-Wert haben und die Ausgabe entsprechend beeinflussen. Um zu verifizieren, wenn Sie x auf 1 initialisieren, sollte die Ausgabe dann wie die zweite Eingabe (i_y) sein.

0

Wie @hackcks sagte, Sie können nicht zwei Werte von einer Funktion zurückgeben. Definieren Sie stattdessen die Argumente für input() als Zeigervariablen und machen Sie input() und geben Sie void zurück.

so ur endgültige Code kann wie folgt aussehen:

#include <stdio.h> 

void input(int *i_x, int *i_y); 
int mult (int x, int y); 

int main() 
{ 
int x; 
int y; 
int z; 

input (&x, &y); 

printf("In Main: x, y: %d, %d\n", x, y); 
z = mult(x,y); 
printf("The product of your two numbers is %d\n", z); 

getchar(); 
getchar(); 
} 


void input(int *i_x, int *i_y) 
{  

    printf("Please input two numbers to be multiplied: "); 
    scanf("%d", i_x); 
    scanf("%d", i_y); 
    printf("In Input: x, y: %d, %d\n", *i_x, *i_y); 

} 

int mult (int x, int y) 
{ 
int a; 
int b; 
int c; 

a = x; 
b = y; 

printf("In Multi: x, y: %d, %d\n", a, b); 

c = a*b; 

return c; 
} 
+0

danke das ist wirklich hilfreich. nur ein wenig verwirrt. Im neuen Code sagt man also effektiv: * i_x = & x; (was ich verstehe) aber ich verstehe scanf nicht ("% d", i_x); Sicher wollen Sie scanf ("% d", * i_x) sagen, weil * i_x auf den Wert von x zeigt. Entschuldigung, kannst du bitte etwas weiter expandieren? –

+0

Erinnern Sie sich scanf erfordert, dass Sie auf das Bit des Adresswerts der Variablen verweisen, die den Wert speichern soll. Wenn also ein Zeiger in scanf verwendet wird (vorausgesetzt, er zeigt bereits auf die Adresse eines Wertes, in diesem Fall i_x = & x), verweist die Variable automatisch auf die Adresse.Dies beseitigt das inkorrekte scanf (& i_x). Auch ein Zeiger selbst ist im Grunde eine Variable, die auf den Anfang einer Adresse verweist, so dass sie immer noch in scanf verwendet werden kann, ohne auf eine Variable zu zeigen, aber immer noch scanf (i_x). – Yeezus