我的代码中有错误。我该如何处理?
它无法成功编译,但我找不到任何错误。
#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');
}
};
#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;
}
答案 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;
};