将指针char数组划分为其他数组

时间:2018-09-12 07:29:29

标签: c++

打印时,出现类似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值来防止这种情况。因此,如果我在那里也有问题,请告知。再次感谢。

2 个答案:

答案 0 :(得分:4)

表达式2 <= t < 4等于(2 <= t) < 4。也就是说,检查2 <= t(是布尔truefalse)的结果是否小于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); hM变量吗?

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);