Arrays 尝试修改两个单独数组中的递增索引时出现sigseg错误

Arrays 尝试修改两个单独数组中的递增索引时出现sigseg错误,arrays,c++11,Arrays,C++11,所以我试图将一个字符数组分成4个字符的块,跟踪当前块是偶数还是奇数,然后按递增奇数顺序再递增偶数顺序重新排列。我有一个int变量来跟踪我在数组中的索引,还有一个for循环来确定当前块是否为奇数,如果为奇数,则将这些字符放入arrayOne,如果为偶数则放入ArrayT2。最后我会把arrayOne和arrayTwo放在一起。然而,我认为循环中递增的idx变量检查当前块是否抛出sigseg错误,我不确定原因 void unzip_file(const std::string& filena

所以我试图将一个字符数组分成4个字符的块,跟踪当前块是偶数还是奇数,然后按递增奇数顺序再递增偶数顺序重新排列。我有一个int变量来跟踪我在数组中的索引,还有一个for循环来确定当前块是否为奇数,如果为奇数,则将这些字符放入arrayOne,如果为偶数则放入ArrayT2。最后我会把arrayOne和arrayTwo放在一起。然而,我认为循环中递增的idx变量检查当前块是否抛出sigseg错误,我不确定原因

void unzip_file(const std::string& filename) {
ifstream file(filename, ios::in | ios::binary | ios::ate);
streampos sz = file.tellg();
file.seekg(0, ios::beg);
char* input = new char[sz];
file.read(input, sz);

char* arrayOne = new char[sz / 2];
char* arrayTwo = new char[sz / 2];
char* finalArray = new char[sz];
int eo = sz / 4;
int idx = 0;

for (int i = 1; i <= eo; i++) {
    if (i % 2 != 0) {
        for (int x = 0; x < 4; x++) {
            arrayOne[idx] = input[idx];
            idx++;
        }
    }
    else {
        for (int y = 0; y < 4; y++) {
            arrayTwo[idx] = input[idx];
            idx++;
        }
    }
}

您正试图使用与较大的
输入
数组相同的索引写入较小的
数组one
数组two
。如果
idx>=(sz/2)
,这将给出一个SEGV。尝试对较小的数组使用自己的索引

// make input length multiple of 4
const char input[] = "H   W   e   o   l   r   l   l   o   d   ,   !   ";
const int sz = sizeof(input)/sizeof(input[0]);

// add one here if we want a c-string afterwarts (\0-terminated)
char* arrayOne = new char[(sz / 2) + 1];
char* arrayTwo = new char[(sz / 2) + 1];
char* finalArray = new char[sz];
int eo = sz / 4;
int idx = 0;

// keep different indices to arrayOne and arrayTwo
int idxOne = 0;
int idxTwo = 0;

for (int i = 1; i <= eo; i++) {
    if (i % 2 != 0) {
        for (int x = 0; x < 4; x++) {
            arrayOne[idxOne] = input[idx];
            idx++;
            // increment these seperately
            idxOne++;
        }
    }
    else
    {
        for (int y = 0; y < 4; y++) {
            arrayTwo[idxTwo] = input[idx];
            idx++;
            // increment these seperately
            idxTwo++;
        }
    }
}
// terminate to make a valid c-string
arrayOne[idxOne] = '\0';
arrayTwo[idxTwo] = '\0';

printf("%s\n", arrayOne);
printf("%s\n", arrayTwo);
//使输入长度为4的倍数
常量字符输入[]=“H W e o l r l o d,!”;
const int sz=sizeof(输入)/sizeof(输入[0]);
//如果我们想要一个c字符串后缀(\0-终止),请在此处添加一个
char*arrayOne=新字符[(sz/2)+1];
char*arrayTwo=新字符[(sz/2)+1];
char*finalArray=新字符[sz];
int-eo=sz/4;
int-idx=0;
//对arrayOne和arrayTwo保留不同的索引
int-idxOne=0;
int-idxTwo=0;

对于(int i=1;i
arrayOne
input
的一半大小。应该
input[sz-1]
go在哪里?谢谢,这修复了分割错误,但是arrayOne的内容是“hel l o,!”而arrayTwo的内容是“wo r l d!1”为什么在每个数组的末尾都有一个额外的字符,为什么在第二个数组中是1?输入数组中甚至没有1。两个数组的内容应该在循环之后是什么?数组中的一个应该是“H e l o”,而数组中的两个应该是“W o r l d!”。请参阅更新的答案。我在输入字符串的末尾添加了空格,使长度为4的倍数。我以0结尾字符串,使其可打印(如果不一定是c字符串,则不需要)
// make input length multiple of 4
const char input[] = "H   W   e   o   l   r   l   l   o   d   ,   !   ";
const int sz = sizeof(input)/sizeof(input[0]);

// add one here if we want a c-string afterwarts (\0-terminated)
char* arrayOne = new char[(sz / 2) + 1];
char* arrayTwo = new char[(sz / 2) + 1];
char* finalArray = new char[sz];
int eo = sz / 4;
int idx = 0;

// keep different indices to arrayOne and arrayTwo
int idxOne = 0;
int idxTwo = 0;

for (int i = 1; i <= eo; i++) {
    if (i % 2 != 0) {
        for (int x = 0; x < 4; x++) {
            arrayOne[idxOne] = input[idx];
            idx++;
            // increment these seperately
            idxOne++;
        }
    }
    else
    {
        for (int y = 0; y < 4; y++) {
            arrayTwo[idxTwo] = input[idx];
            idx++;
            // increment these seperately
            idxTwo++;
        }
    }
}
// terminate to make a valid c-string
arrayOne[idxOne] = '\0';
arrayTwo[idxTwo] = '\0';

printf("%s\n", arrayOne);
printf("%s\n", arrayTwo);