Как мне сохранить массив в трех разных на основе разделителей - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу разделить входной массив на три разных на основе / в качестве разделителя.

Я попробовал (возможно, наивный) подход сохранения входной строки в разных массивах, используяgetchar и while для чтения символов в массиве и использования счетчика для подсчета того, сколько раз появляется /.

Исходя из этого числа, я бы использовал:

if (slashcounter == 0) {
      destinationarray[i++] = c;
}

, чтобы сохранить его в соответствующем массиве.полная реализация приведена ниже.

обратите внимание, что я пытаюсь сделать это, используя только stdio.h

#include <stdio.h>

char c; 
char replace[80], toBeReplaced[80], input[80], testInput[80];
int i = 0;
int slashcounter = 0;

int main(){

    puts("Enter a line of text: ");

    while (( c = getchar()) != '\n'){

        if (c == '/') {
            slashcounter++;
        }

        if (slashcounter == 0) {
            replace[i++] = c;
        }

        else if (slashcounter == 1) {
            toBeReplaced[i++] = c;
        }

        else if (slashcounter == 2) {
            input[i++] = c;
        }


    }
    //debug purpose
    puts("The arrays have the following content\n");
    puts("replace[]:\n");
    puts(replace);
    puts("\n");
    puts("toBeReplaced[]:\n");
    puts(toBeReplaced);
    puts("\n");
    puts("input[]:\n");
    puts(input);
    printf("Slashcounter = %d\n",slashcounter);



    return 0;

К сожалению, происходит следующее: первое слово, то есть слово перед первой косой чертой,хранится правильно, но остальные два пусты.

Что я сделал не так здесь

токовый выход с входом this/test/fails

Enter a line of text: 
this/test/fails
The arrays have the following content

replace[]:

this


toBeReplaced[]:




input[]:


Slashcounter = 2
Program ended with exit code: 0

пс. Я также хотел бы убедиться, что / сотсутствует в выходном массиве.

Спасибо за помощь.

1 Ответ

2 голосов
/ 15 апреля 2019

В вашем коде есть две непосредственные проблемы: во-первых, вы пропускаете добавление нулевого символа для завершения каждой подстроки, во-вторых, вы никогда не сбрасываете индекс в 0, когда читаете /

Другие проблемы: вы не проверяете, будете ли вы записывать из массивов, и не управляете EOF

Вы также постоянно проверяете значение slashcounter , это довольно дорого ни за что, вы можете иметь 3 цикла или использовать указатель, чтобы указать массив для заполнения и т. Д.

Также нет причин использовать глобальные переменные, все они могут быть локальными в main

Пример с минимальными изменениями:

#include <stdio.h>

int main(){
  int c;
  char replace[80], toBeReplaced[80], input[80];
  int i = 0;
  int slashcounter = 0;

  puts("Enter a line of text: ");

  while (( c = getchar()) != '\n') {
    if (c == EOF) {
      fprintf(stderr, "unexpected EOF");
      return -1;
    }

    if (c == '/') {
      if (slashcounter == 0) {
        replace[i] = 0;
      }
      else if (slashcounter == 1) {
        toBeReplaced[i] = 0;
      }
      else if (slashcounter == 2) {
        input[i] = c;
      }
      i = 0;
      slashcounter++;
    }
    else if (slashcounter == 0) {
      if (i != (sizeof(replace) - 2))
        replace[i++] = c;
    }
    else if (slashcounter == 1) {
      if (i != (sizeof(toBeReplaced) - 2))
        toBeReplaced[i++] = c;
    }
    else if (slashcounter == 2) {
      if (i != (sizeof(input) - 2))
        input[i++] = c;
    }
  }

  if (slashcounter == 0) {
    replace[i] = 0;
    toBeReplaced[0] = 0;
    input[0] = 0;
  }
  else if (slashcounter == 1) {
    toBeReplaced[i] = 0;
    input[0] = 0;
  }
  else if (slashcounter == 2) {
    input[i] = 0;
  }

  //debug purpose
  puts("The arrays have the following content\n");
  puts("replace[]:\n");
  puts(replace);
  puts("\n");
  puts("toBeReplaced[]:\n");
  puts(toBeReplaced);
  puts("\n");
  puts("input[]:\n");
  puts(input);
  printf("Slashcounter = %d\n",slashcounter);

  return 0;
}

Примечание. Я использую int для c для обработки EOF , и я удалил бесполезный массив testInput

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
Enter a line of text: 
this/test/fails
The arrays have the following content

replace[]:

this


toBeReplaced[]:

test


input[]:

fails
Slashcounter = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...