Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;怪圈_C++_Loops - Fatal编程技术网

C++ C++;怪圈

C++ C++;怪圈,c++,loops,C++,Loops,我写了这个函数。在调试过程中,我看到在函数的最后,它进入字符串cmonth[]declare,然后返回到函数的最后,然后返回字符串cmonth[]declare,大约10次。然后它返回到函数的第一行,然后返回到函数的最后一行大约100次或更多次 int CheckLastDate(string file) { string line, dline[200]; int i = 0; regex rxdate("[[:digit:]].:[[:digit:]].:[[:digit:]]."); if

我写了这个函数。在调试过程中,我看到在函数的最后,它进入
字符串cmonth[]
declare,然后返回到函数的最后,然后返回
字符串cmonth[]
declare,大约10次。然后它返回到函数的第一行,然后返回到函数的最后一行大约100次或更多次

int CheckLastDate(string file)
{
string line, dline[200];
int i = 0;
regex rxdate("[[:digit:]].:[[:digit:]].:[[:digit:]].");
ifstream infile;
infile.open(file.c_str());

if(! infile.is_open()) return -1;

while (infile.good())
{
    getline(infile, line);
    if(regex_search(line, rxdate))
    {
        dline[i] = line;
        i++;
    }
}
i--; //needed b/c dline starts at 0;
infile.close();

int imonth, day, hour, min, sec, year;
string month, ampm;
string cmonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

month = dline[i].substr(5,3);
//convert month to number
for(int j = 0; j<12; j++)
{
    if(month == cmonth[j]) imonth=j+1;
}

day = atoi(dline[i].substr(9, 2).c_str());
hour = atoi(dline[i].substr(12, 2).c_str());
min = atoi(dline[i].substr(15, 2).c_str());
sec = atoi(dline[i].substr(18, 2).c_str());
ampm = dline[i].substr(21, 2);
year = atoi(dline[i].substr(24, 4).c_str());

if(ampm == "PM" && hour != 12) { hour += 12; } //turn into 24 hours
else if(ampm == "AM" && hour == 12) { hour = 0; }

time_t now, dif; //dif = date in file
double diff;
time(&now);
struct tm * timeinfo;
timeinfo = localtime(&now);
timeinfo->tm_mon = imonth - 1;
timeinfo->tm_mday = day;
timeinfo->tm_hour = hour;
timeinfo->tm_min = min;
timeinfo->tm_sec = sec;
timeinfo->tm_year = year - 1900;
timeinfo->tm_isdst = -1; //-1 = no info
dif = mktime(timeinfo);
diff = difftime(now, dif);

if(diff >= 86400) return 1; //more then 24 hours
else return 0;
}
int CheckLastDate(字符串文件)
{
弦线,dline[200];
int i=0;
正则表达式rxdate(“[[:digit:].:[:digit:].:[:digit:].:[:digit:].”);
河流充填;
open(file.c_str());
如果(!infle.is_open())返回-1;
while(infle.good())
{
getline(填充,行);
if(正则表达式搜索(行,rxdate))
{
dline[i]=直线;
i++;
}
}
i--;//所需的b/c数据线从0开始;
infle.close();
国际月、日、时、分、秒、年;
字符串月份,ampm;
字符串cmonth[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
月=dline[i].子序列(5,3);
//将月份转换为数字
对于(int j=0;jtm_mon=imonth-1;
timeinfo->tm_mday=天;
timeinfo->tm_hour=hour;
timeinfo->tm_min=min;
时间信息->tm_秒=秒;
timeinfo->tm_year=year-1900;
timeinfo->tm_isdst=-1;//-1=无信息
dif=mktime(时间信息);
diff=difftime(现在,dif);
如果(diff>=86400)返回1;//超过24小时
否则返回0;
}
<> P>有什么不对吗?或者C++是如何工作的?
谢谢你的帮助。

是调试还是发布版本?你在C++代码级还是汇编程序级调试?


在发布版本中,编译器可能会生成初始函数中不存在的各种代码跳转。

看起来不错,但有一些常规指针:

您对月份的for循环检查将贯穿所有月份,即使它找到了月份, 这似乎没有必要

您应该养成总是初始化所有变量的习惯。在调试模式下,变量可能会被初始化,但在发布模式下,它们通常不会被初始化

您应该添加一些检查,以确保正则表达式返回的字符串具有您期望的格式。例如,检查长度。如果标记用空格分隔,您还可以使用
strtok_s()
来拆分字符串。如果标记始终具有特定长度或位于特定索引处,则可能比预期的安全


当从文件中读取时,如果文件超过200行,则没有检查以防止错误。应该考虑这一点。例如,<代码>(Ifr.Auth.Author(and)< 200)

这可能是析构函数调用。如果源与编译程序不匹配,您确定是否建立了正确的源代码?(即,您进行了更新,但未对其进行编译)然后,调试器似乎会做一些非常奇怪的事情。可能是在启用优化的情况下进行调试?或者是在“发布模式”下进行调试?优化会对代码产生奇怪的影响,从而使调试变得困难。Mat可能是对的。boost::regex可能会有一些奇怪的事情。如果查看函数末尾的反汇编代码,您会发现也许我得到了更多的线索。“我看到了Martin Sorry的评论。我正在使用G+。我也使用NETBeBes,NETBeas使用这些选项,同时调试:<代码> -MMD -MP-MF< /Cord>。我在调试模式下调试。此外,我正在C++代码级别调试。这是我正在拆分的字符串类型:“THU,AUG 02 12:56:43 AM 2012 EDT”。此外,我正在使用DebianLinux和Boost(仅适用于regex)。