变量“ pos”没有被初始化就被使用

时间:2019-03-28 13:10:18

标签: c++ c++11

我的代码中有错误。我该如何处理?

它无法成功编译,但我找不到任何错误。

Day.h

#pragma once
#include<iostream>
#include<string>
typedef unsigned ud;
using std::string;
class Day
{
public:
    Day() = default;
    Day(string a) {
        decltype(a.size()) pos;
        if (a.find("Jan") != string::npos)
            month = 1;
        else if (a.find("Feb") != string::npos)
            month = 2;
        else if (a.find("Mar") != string::npos)
            month = 3;
        else if (a.find("Apr") != string::npos)
            month = 4;
        else if (a.find("May") != string::npos)
            month = 5;
        else if (a.find("Jun") != string::npos)
            month = 6;
        else if (a.find("Jul") != string::npos)
            month = 7;
        else if (a.find("Aug") != string::npos)
            month = 8;
        else if (a.find("Sep") != string::npos)
            month = 9;
        else if (a.find("Oct") != string::npos)
            month = 10;
        else if (a.find("Nov") != string::npos)
            month = 11;
        else if (a.find("Dec") != string::npos)
            month = 12;
        else {
            pos = a.find_first_not_of("123456789");
            month = stoi(a.substr(0, pos));
        }
        pos++;
        auto now = a.find_first_not_of("123456789", pos);
        day = stoi(a.substr(pos, now - pos));
        pos = now + 1;
        year = stoi(a.substr(pos, a.size() - pos));
    }
    ud get_year() {
        return year;
    }
    ud get_month() {
        return month;
    }
    ud get_day() {
        return day;
    }
    std::ostream& print(std::ostream& os) {
        os << year << ' ' << month << ' ' << day;
        return os;
    }
private:
    ud year;
    ud month;
    ud day;
    bool iszm(char x) {
        return (x >= 'A'&&x <= 'z');
    }
};

main.cpp

#include"pch.h"
#include<iostream>
#include<forward_list>
#include<deque>
#include<vector>
#include<string>
#include<list>
#include<array>
#include<cstdlib>
#include"Day.h"
using namespace std;
int main()
{
Day tmp("March 27,2019");
    tmp.print(cout);
return 0;
}

3 个答案:

答案 0 :(得分:1)

...
else {
  pos = a.find_first_not_of("123456789");
  month = stoi(a.substr(0, pos));
}

pos++;  //<<<<<<<<<<<<<<

auto now = a.find_first_not_of("123456789", pos);
day = stoi(a.substr(pos, now - pos));
...

到达行pos++;时,pos仅在执行了包含else的{​​{1}}子句后才具有已知值,并且只有在{ {1}}与pos = a.find_first_not_of("123456789");a等不同。

别忘了局部变量没有初始化为某个默认值,但是它们的初始内容是不确定的。

离题:此代码确实丑陋,可能还会有更多问题。

答案 1 :(得分:1)

  decltype(a.size()) pos;
    if (a.find("Jan") != string::npos)
        month = 1;
    //    other else if statements removed
    else {
        pos = a.find_first_not_of("123456789");
        month = stoi(a.substr(0, pos));
    }
    pos++;

在上面,我删除了一系列else if语句。

pos已定义,并且未初始化。

如果a.find("Jan") != string::npos,则永远不会分配pos。下一个操作是pos++,它检索pos的值以使其递增。由于pos已统一,因此行为是不确定的。

在您的代码中,给pos分配一系列else if的值的唯一位置是最后一个else。通过该代码的所有其他路径都会导致pos++出现不确定的行为,因为-编译器警告您-pos尚未初始化。

解决问题的方法是确保无论执行流程如何发生,pos都会在递增之前进行初始化。

一种简单的方法来确保将定义更改为

decltype(a.size()) pos = 0;

对于您的代码是否正确,取决于最终else以外的所有情况下您期望发生的情况。

答案 2 :(得分:0)

谢谢。我解决了这个问题。

#pragma once
#include<iostream>
#include<string>
typedef unsigned ud;
using std::string;
class Day
{
public:
    Day() = default;
    Day(string a) {
        decltype(a.size()) pos=0;
        if (a.find("Jan") != string::npos)
            month = 1;
        else if (a.find("Feb") != string::npos)
            month = 2;
        else if (a.find("Mar") != string::npos)
            month = 3;
        else if (a.find("Apr") != string::npos)
            month = 4;
        else if (a.find("May") != string::npos)
            month = 5;
        else if (a.find("Jun") != string::npos)
            month = 6;
        else if (a.find("Jul") != string::npos)
            month = 7;
        else if (a.find("Aug") != string::npos)
            month = 8;
        else if (a.find("Sep") != string::npos)
            month = 9;
        else if (a.find("Oct") != string::npos)
            month = 10;
        else if (a.find("Nov") != string::npos)
            month = 11;
        else if (a.find("Dec") != string::npos)
            month = 12;
        else {
            pos = a.find_first_not_of("123456789");
            month = stoi(a.substr(0, pos));
        }
        pos = pos ? pos : a.find_first_not_of("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm");
        pos++;
        auto now = a.find_first_not_of("123456789", pos);
        day = stoi(a.substr(pos, now - pos));
        pos = now + 1;
        year = stoi(a.substr(pos, a.size() - pos));
    }
    ud get_year() {
        return year;
    }
    ud get_month() {
        return month;
    }
    ud get_day() {
        return day;
    }
    std::ostream& print(std::ostream& os) {
        os << year << ' ' << month << ' ' << day;
        return os;
    }
private:
    ud year;
    ud month;
    ud day;
};