我需要幫助解決這個問題,所以如果有人有類似的問題,它會幫助我。
例如:
Enter: 2 3
Output: 4199120/3436544
It should print: 2/3
為什么輸出與我預期的不同?
struct Fraction { int x1, x2; };
void function(struct Fraction p, int *d) {
p.x1=d[0];
p.x2=d[1];
}
int main() {
struct Fraction frac;
int d[2];
for(int i=0;i<2;i ) {
scanf("%d", &d[i]);
}
function(frac, d);
printf("%d/%d", frac.x1, frac.x2);
return 0;
}
uj5u.com熱心網友回復:
您frac 按值傳遞給function(鏈接解釋了為什么不修改引數的確切原因)。嘗試:
void function(struct Fraction *p, int *d) {
p->x1=d[0];
p->x2=d[1];
}
int main() {
...
function(&frac, d);
printf("%d/%d", frac.x1, frac.x2);
return 0;
}
uj5u.com熱心網友回復:
始終注意您的編譯器警告。
main.c: In function ‘main’:
main.c:21:1: warning: ‘frac.x2’ is used uninitialized in this function [-Wuninitialized]
21 | printf("%d/%d",frac.x1,frac.x2);
您的編譯器告訴您frac未初始化。為什么?function應該初始化它,即用資料填充它。
但是,您將其按值傳遞給您的function. 你的function,在執行時,創建一個全新的struct Fraction,復制frac你通過的內容,然后做你期望它做的事情;用 and填充它自己的struct Fraction p,d[0]并d[1]回傳,用它洗掉區域變數struct Fraction p。
printfin 主要只是列印開始時的垃圾frac。
您function應該將實際變數frac本地修改為 main,因此您需要將其地址傳遞為:
function( &frac, d );
當然function應該接受它:
void function(struct Fraction *p, int *d)
{
p->x1 = d[0];
p->x2 = d[1];
}
uj5u.com熱心網友回復:
另一種選擇是從函式回傳一個結構
struct Fraction function(int *d) {
struct Fraction res;
res.x1 = d[0];
res.x2 = d[1];
//int gcd = calc_gcd(d[0], d[1]); // calc_gcd() calculates the greatest common denominator
// implementation left as an exercise
//rec.x1 /= gcd;
//rec.x2 /= gcd;
return res;
}
然后你的代碼將是
int main(void) {
struct Fraction frac;
int d[2];
for(int i = 0; i < 2; i ) {
scanf("%d", &d[i]); // error checking ommited for brevity
}
frac = function(d);
printf("%d/%d\n", frac.x1, frac.x2);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438301.html
