打印时,出现类似17:1733╠╠╠╠╠╠╠╠17:╠╠
的错误。
我不知道。如果您能解决并给我更好的方法,我将不胜感激。感谢您的帮助。
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
char* time = "173324";
char holdh[3];
char holdM[3];
char holds[3];
holdh[2] = '\0';
holdM[2] = '\0';
holds[2] = '\0';
int t;
for (t = 0; t < 6;t++)
{
if (t < 2)
holdh[t] = *(time + t);
else if (2 <= t < 4) {
t = t - 2;
holdM[t] = *(time + t);
t = t + 2;
}
else if (4 <= t < 6)
{
t = t - 4;
holds[t] = *(time + t);
t = t + 4;
}
}
string h(holdh);
string M(holdM);
string s(holds);
string datex = h + ":" + M + ":" + s;
cout << datex;
return 0;
}
这可能是内存溢出,但是我尝试通过分配null
值来防止这种情况。因此,如果我在那里也有问题,请告知。再次感谢。
答案 0 :(得分:4)
表达式2 <= t < 4
等于(2 <= t) < 4
。也就是说,检查2 <= t
(是布尔true
或false
)的结果是否小于4
,这将总是因为布尔结果是0
(对于false
)或1
(对于true
)。
如果要比较范围,则需要例如2 <= t && t < 4
。
更一般地说,我建议您不要为此使用循环。而是直接进行分配:
// Create three arrays and initialize all elements to zero
char holdh[3] = {};
char holdM[3] = {};
char holds[3] = {};
holdh[0] = time[0];
holdh[1] = time[1];
holdM[0] = time[2];
holdM[1] = time[3];
holds[0] = time[4];
holds[1] = time[5];
更简单的和更清楚地显示您的意图。
您甚至不需要 临时holdX
变量,因为您可以从time
获取子字符串并初始化h
,{ {1}}和M
直接:
s
您真的真的需要 临时const char* time = "173324";
std::string h(time + 0, time + 2);
std::string M(time + 2, time + 4);
std::string s(time + 4, time + 6);
,h
和M
变量吗?
s
您真的真的需要新分配的字符串吗?
std::cout << std::string(time + 0, time + 2) << ':'
<< std::string(time + 2, time + 4) << ':'
<< std::string(time + 4, time + 6) << '\n';
答案 1 :(得分:1)
您的代码是教科书中循环内错误使用if()
语句的示例。
当您实际上知道必须在哪里停止迭代时,在每次迭代中重复所有相同的检查会发生什么情况。
您假设if()检查表达式中的每个比较。没有。它计算表达式并检查结果是否等于非零值或布尔值true
。因此if(4 <= t < 6)
是一个错误。等效于if( (4 <= t) < 6 )
。如果b大于1,则(a <= t) < b
始终为真。
代码的最简单转换是:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
using std::string;
using std::cout;
int main()
{
const char* time = "173324";
// note, that making it non-const is a not standard compliant
char hold[3][3] = {}; // zero initialization
for (int t = 0; t < 6;t++)
{
hold[t / 2][t % 2] = time[t];
}
string h(hold[0]);
string M(hold[1]);
string s(hold[2]);
string datex = h + ":" + M + ":" + s;
cout << datex;
return 0;
}
也许甚至是这样:
string hold[3];
for (int t = 0; t < 6;t++)
{
hold[t / 2] += time[t];
}
string datex = hold[0] + ":" + hold[1] + ":" + hold[2];
但是更好的是,您应该完全避免循环,只要字符串具有接收源头和结尾的迭代器的构造函数即可。
std::string h(time + 0, time + 2);