2017-02-19 11 views
0

Рассмотрите следующую программу. По существу у меня есть struct имя человека, которое по умолчанию содержит 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 NAME и 0, так как я не изменил значение по умолчанию, но мой 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

вы смешиваете C++ с printf функции C. printf не может знать, что вы передаете что-то еще, кроме строки, потому что аргументы printf - это переменная и функция «доверяет» строке форматирования & вызывающего абонента для обеспечения правильных типов.

То, что вы видите, это char * представление std::string объекта: двоичные данные/мусора при печати как есть (а также громит в age аргумент из-за неправильного размера аргумента)

Вы должны использовать std::cout из iostream, который признает 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^