2016-05-06 5 views
-1

私はC言語に戻っています。私はちょうど練習していて、この問題に遭遇しました。私がしようとしています:コードをCの関数に分割する

  1. (scanf関数から2つの変数を取る)
  2. 二つの入力
  3. を乗算して出力私は関数に異なる部分を分割しようとしていた問題

が、プログラムは狂った高い数字になります(代わりにメモリアドレスだと思います)。おそらく私の誤解がないためです。

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

答えて

3

x, y = input();あなたが期待していることはありません。関数から2つの値を返すことはできません。 comma operatorについてお読みください。

私はむしろxyというアドレスを関数inputに渡すことをお勧めします。変更のプロトタイプは、最初

void input(int *, int *);  

はその後

input(&x, &y); 

として、それを呼び出し、それがintとして定義される、値を返す必要があります定義

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。あなたはポインタについて読むべきです。 – haccks

+0

本当に助けていただきありがとうございます。ほんの少し混乱しています。新しいコードでは、効果的に* i_x =&x;私は理解していますが、私はscanf( "%d"、i_x)を理解できません。 * i_xがxの値を指しているので、あなたはscanf( "%d"、* i_x)と言っています。すみませんが少し拡大していただけますか? –

0

mainを変更します。
return i_x, i_y;は、 [comma operator]の定義によってi_yのみを返します。同じ定義でx, y = input();yを割り当てているだけです。

0

@haccksから指摘されているように、input()の呼び出しによるx &の割り当ては正しく動作しません。 変数xは単位化されたジャンク値を持つだけで、それに応じて出力に影響します。 検証するには、xを1に初期化すると、出力は2番目の入力(i_y)と同じになります。

0

@haccksと同様、uは関数から2つの値を返すことはできません。むしろ、input()の引数をポインタ変数として定義し、input()とvoidを返します。

そうウル最終的なコードは次のように見ることができます:

#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

本当に助けていただきありがとうございます。ほんの少し混乱しています。新しいコードでは、効果的に* i_x =&x;私は理解していますが、私はscanf( "%d"、i_x)を理解できません。 * i_xがxの値を指しているので、あなたはscanf( "%d"、* i_x)と言っています。申し訳ありません少し拡大してくださいできますか? –

+0

scanfは、値を格納しようとしている変数のアドレス値の呼び出しを参照する必要があります。したがって、ポインタがscanfで使用されると自動的に(すでに値のアドレスを指している、この場合はi_x =&x)、変数はすでにそのアドレスを参照しています。これにより、間違ったscanf(&i_x)が削除されます。また、ポインタ自体は基本的にはアドレスの先頭を参照する変数であるため、変数を指定せずにscanf(i_x)を使用してscanfで引き続き使用することができます。 – Yeezus

関連する問題