2017-02-19 2 views
0

次のプログラムを検討してください。基本的に私はstructという名前のPersonを持っています。デフォルトではname="NO NAME"age = 0が含まれています。今度は最初に5 Personを追加するベクトルを作成します。 forループがちょうど5サイズのベクトルを終了した後、デバッガでも実行されました。デフォルトはPersonです。しかし、私がそれを印刷しようとすると、何かがうまくいかない。構造体をベクトルに渡すと、ベクトルを出力すると奇妙な結果が得られます

私は何も変更していないので、最初にconstベクターを渡します。 printfを使用して、私はこれを行います:list_of_persons.at(i).name, list_of_persons.at(i).age、人の名前と年齢をプリントアウトするだけです。デフォルト値を変更していないので、NO NAME0となるはずですが、私のcmdは私に何か別の方法を与えてくれます。

enter image description here

// Example program 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

int main(); 

struct Person { 
    string name = "NO NAME"; 
    int age = 0; 
}; 

void print_vector(const vector <Person> &); 

int main() 
{ 
    vector<Person> list_of_persons; 
    for (unsigned int i = 0; i < 5; i++) 
    { 
     struct Person p; 
     list_of_persons.push_back(p); 
    } 
    print_vector(list_of_persons); 

    printf("\n"); 

    system("pause"); 
    return 0; 
} 

void print_vector(const vector<Person>& list_of_persons) 
{ 
    for (unsigned int i = 0; i < list_of_persons.size(); i++) 
    { 
     printf("Person %d \n", i); 
     printf("Name: %s\nAge: %d \n \n", list_of_persons.at(i).name, list_of_persons.at(i).age); 
    } 
} 
+3

を使用してCおよびC++は_different languages_です! – ForceBru

答えて

3

あなたはprintf C関数とC++を混合しています。 printfは、printfの引数がの変数であり、関数が適切な型を提供する呼び出し元のフォーマット文字列&を「信頼する」ため、文字列以外のものを渡していることを知ることはできません。認識iostreamから

あなたが使用する必要がありますstd::cout(とも正しくないため、引数のサイズのage引数をゴミ)されたとして、印刷したときに、バイナリデータ/ごみ:あなたが見る何

std::stringオブジェクトのchar *表現ですstd::stringタイプが適切です。例えば、次のように:

std::cout << "Name: " << list_of_persons.at(i).name << "\nAge: " << list_of_persons.at(i).age << "\n \n"; 

あなたはprintfに固執したい場合は、基礎となるconst char *上のポインタを取得する必要がc_str()

printf("Name: %s\nAge: %d \n \n", list_of_persons.at(i).name.c_str(), list_of_persons.at(i).age); 
関連する問題