如何输出属于矢量数组的struct字符串?

时间:2018-02-01 14:42:43

标签: c++ vector struct

我遇到了一个奇怪的问题:首先我需要scanf函数来输入一个特殊的流,如下所示:scanf("%s %4d/%2d/%2d", &temp.name, &temp.year, &temp.month, &temp.day);,temp的类型是一个结束四个变量的结构:

struct citizen{
   char* name;
   int year;
   int month;
   int day;
}

实际上我使用字符串类型而不是char *,但scanf似乎不支持它。我创建一个向量,并将temp推入此向量,当我结束我的输入任务时,我想输出变量:结构的名称,但程序总是出错并分解,我的完整代码如下:< / p>

#include <iostream>
//#include <string>
#include <vector>
#include <iterator> 
#include <algorithm>
using namespace std;

struct citizen{
    char* name;
    int year;
    int month;
    int day;

    bool operator < (const citizen &A) const{
        return (year*365+month*30+day) < (A.year*365+A.month*30+A.day);
    }
};
int main(){
    int n;
    cin >> n;

    vector<citizen> ci; 
    citizen temp;
    int bb = 2014*365+9*30+6;
    for(int i = 0; i < n; i++){
        scanf("%s %4d/%2d/%2d", &temp.name, &temp.year, &temp.month, &temp.day);
        bool p = 1;
        int bt = temp.year*365+temp.month*30+temp.day; 
        if(bt>bb)
            p = 0;
        else if((bb-bt) > 200*365)
            p = 0;
        if(p)
            ci.push_back(temp);
    }
    printf("%s", ci[0].year);       //1st method to ouput
    for(vector<citizen>::const_iterator it = ci.begin(); it != ci.end(); it++) //2nd method to ouput
        cout << it->name;
    //but both goes wrong       
    return 0;
} 

任何想法?

1 个答案:

答案 0 :(得分:1)

声明

scanf("%s %4d/%2d/%2d", &temp.name, &temp.year, &temp.month, &temp.day);

你有两个主要问题:

  1. 扫描字符串时,scanf函数需要指向第一个字符的指针,该字符应为char*类型。您将指针&temp.name传递给指针并且类型为char**

  2. 修复后,您使用temp.name传递的指针指向...我不知道,您也不知道。它是未初始化的,将具有不确定和看似随机的值。您需要使用字符数组,或者动态分配内存并将结果分配给指针。

  3. 当然,如果您使用标准C ++输入代替std::cinstd::string,这根本不会成为问题。