2015-11-10 37 views
1
#include <stdio.h> 
#include <iostream> 
#include <cstdlib> 
#include <sstream> 

using namespace std; 

struct person 
{ 
    int age; 
    string name[20], dob[20], pob[20], gender[7]; 
}; 

int main() 
{ 
    person person[10]; 
    cout << "Please enter your name, date of birth, place of birth, gender, and age, separated by a space.\nFor example, John 1/15/1994 Maine Male 20: "; 
    scanf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age); 
    printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age); 
    return 0; 
} 

我嘗試掃描並打印用戶的年齡,但它給了我2749536的person.age值。這是爲什麼?爲什麼我不能scanf和printf一個整數?

+0

使用'%f'浮點數。或者像'int age'一樣定義年齡;' –

+0

使用'cin'和'cout'(你在開始時就已經做過一次),如果你使用的C++特性不能用在C('iostream','cout','using namespace'等) –

+0

我打算寫int。但它仍然不起作用。 – johnny880

回答

5

首先,在person的聲明中更改stringchar

struct person 
{ 
    int age; 
    char name[20], dob[20], pob[20], gender[7]; 
// ^^^^ 
}; 

然後,你需要從&person[0].age呼叫刪除符號,以printf,因爲你傳遞int的地址,而不是它的價值。同時刪除從字符串&符號在scanfprintf電話:

scanf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, &person[0].age); 
// Only one ampersand is needed above: -------------------------------------------------^ 
printf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, person[0].age); 

Demo.

+0

現在它修復了「2749536」,但是當我輸入「20」時,它輸出0. – johnny880

+0

@ johnny880你輸入了什麼值?它們是否包含空格? – dasblinkenlight

+0

我輸入完全沒有引號:「約翰1/15/1994緬因州男20」 – johnny880

3

您應該將age的類型從float更改爲int

否則,使用%ffloat類型。

此外,如Mr. dasblinkenlight所示,將string更改爲char

然後,在printf()的情況下,從&person[0].age中刪除&。你想打印變量的值,而不是地址。 FWIW,要打印地址,應使用%p格式說明符並將參數轉換爲(void *)

不要混淆,並期望他們工作。如果您向所提供的格式說明符提供不正確類型的參數,最終將導致undefined behavior

道德故事:啓用編譯器警告。大多數時候,他們會警告你潛在的隱患。

+0

你好,謝謝,但我從一開始就這樣做了。我不是故意浮在那裏。它本意是int。我編輯了這個問題,但它仍然不起作用。 – johnny880

+0

@ johnny880請檢查最新的答案。 :) –

+0

這也行不通。對於年齡,當我輸入20時,它輸出0. – johnny880

1

您正在將值的地址傳遞給printf。擺脫&爲您傳遞給printf的所有參數以及您傳遞給scanf的字符串。也如其他人所說,使用浮點數%f或將age更改爲int

1

您有一個錯誤在這裏:

printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age); 

它應該是:

printf("%s %s %s %s %d", person[0].name, person[0].dob, person[0].pob, person[0].gender, person[0].age); 

因爲,當你使用'&'我在printf函數中,您正在打印變量的地址而不是其值。所以請記住,你只需要使用'&'掃描任何東西,而不是打印。

1

奇怪的年齡的原因是你輸出的人[0] .ageage地址,而不是價值。 printf()取值,scanf()取地址。你也可能意味着char *數組而不是字符串對象。下面的代碼編譯(雖然有幾個合理的警告),並打印正確的輸出(測試):

#include <stdio.h> 
#include <iostream> 
#include <cstdlib> 
#include <sstream> 

using namespace std; 

struct person 
{ 
    int age; 
    char name[20], dob[20], pob[20], gender[7]; 
}; 

int main() 
{ 
    person person[10]; 
    cout << "Please enter your name, date of birth, place of birth, gender, and age, separated by a space.\nFor example, John 1/15/1994 Maine Male 20: "; 
    scanf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, &person[0].age); 
    printf("%s %s %s %s %d", &person[0].name, &person[0].dob, &person[0].pob, &person[0].gender, person[0].age); 
    return 0; 
} 
相關問題