Добавление каждого другого элемента из одного массива в другой в C - PullRequest
0 голосов
/ 23 апреля 2020

, поэтому я читаю строку символов из файла в массив с именем source. Теперь я хочу разделить этот массив на еще два массива, один из которых содержит все четные индексы, а другой содержит нечетные индексы массива source.

Это код, который у меня есть в настоящее время, и я я пытаюсь выполнить sh в функции reachable.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "graph.h"


void getfile(char[], char[]);
void reachable(char[]);

int size;
int i;

////////////GETFILE FUNCTION/////////////

void getfile(char *graph, char *source) {
    FILE *infile;
    infile = fopen(graph, "r");

    if (infile == NULL) {
        fprintf(stderr, "Can't open input file %s!\n", graph);
        exit(1);
    }
    while (fscanf(infile, "%s", &source[i]) != EOF) {
        ++i;
    }
    fclose(infile);

    size = strlen(source);
    printf("%s\n", source);


    reachable(&source[0]);
}

///////////REACHABLE FUNCTION////////////

void reachable (char *source){

    char odd[100];
    odd[100] ='\0';
    char even[100];
    even[100] = '\0';


   for (i = 0; i<size; i+=2){
//        printf("%c", source[i]);     // when I run this line, I get the output I want
        odd[i] = source[i];            // so why doesn't this put the output into the odd array?
    }

   for (i = 1; i<size; i+=2){
        even[i] = source[i];
    }



    printf("%s\n", odd);
//    printf("%s\n", even);
}

Есть идеи, почему это не работает?

Эта строка хранится в source:

rlxrtgacufkrzyngilzxazrasjsbjqqitxmewplhtwzgxhokfmadrv

и это вывод, который я хочу получить для even и odd.

even: lrgcfryglxzajbqixephwghkmdv
odd: rxtaukznizarssjqtmwltzxofar

Есть идеи, как это сделать? Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Вы вставляете значения в нечетные и четные в том же месте, в котором они изначально хранятся в источнике.

Для целевого массива необходим другой счетчик, чем i:

int destPlace = 0;
for (i = 1; i<size; i+=2) {
        odd[destPlace] = source[i];
        destPlace++;
}

И затем та же процедура для четного массива.

Обратите внимание, что в вашем коде как нечетные, так и четные начинаются с одного и того же индекса, и это даже не первый источник source [0].

0 голосов
/ 23 апреля 2020

Ошибка в l oop в достижимой функции. Для четного вы должны начинать l oop с I = 0 и увеличивать на 2. Для нечетного индекса вы должны начинать l oop с i=1 и увеличивать на 2. Я думаю, что код должен выглядеть следующим образом:

for (i = 1; i<size; i+=2){
        odd[i] = source[i];
    }

   for (i = 0; i<size; i+=2){
        even[i] = source[i];
    }
0 голосов
/ 23 апреля 2020

Хорошо, если вы правильно написали код своей основной функции,

  1. Проверьте:
    char odd[100]; 
    odd[99] ='\0'; //odd array has index from 0 to 99, not 100
    char even[100];
    even[99] = '\0'; //same here
Вы должны отслеживать как нечетные / четные, так и исходные индексы.
    int spliti, srci;

    spliti=0, srci=0; // odd index starts with 0 in C
    while (srci < size) {
        odd[spliti] = source[srci];
        spliti++;
        srci+=2;
    }
    odd[spliti] = '\0';

    spliti=0, srci=1; // even index starts with 1 in C
    while (srci < size) {
        even[spliti] = source[srci];
        spliti++;
        srci += 2;
    }
    even [spliti] = '\0'; 
...