2
respostas

Dividir input único em varias posições de um array

Estou tentando resolver um problema onde o usuário ira digitar no terminal varios produtos de uma so vez separados por barra de espaço e eu terei que retornar um print com os produtos de forma organizada (remover os repetidos e imprimir a lista em ordem alfabética).

Mas estou com um problema, invés de o usuário declarar quantos produtos ele vai digitar e depois ele digitar um por um no terminal o problema pede que o usuário digite todos de uma única vez e eu tenha que tratar essa entrada, então tenho um array de 1000 posições declarado (esse 1000 e o máximo declarado pelo problema) e tenho que pegar essa única linha de produtos e dividir ela em varias posições no array para que possa tratar ele e fazer o que o problema pede, mas como fazer isso?

Como pego um único input com varios items separados por espaço e divido-os em varias posições de um array?

2 respostas

Oi Tibério.

Talvez você possa começar por aqui:

#include <iostream>
using namespace std;

int main()
{
    char myArray[1000];

    cout << "Enter as strings separadas por espaço: " << flush;
    cin.getline(myArray, 1000);

    int i = 0;
    while (myArray[i] != '\0')
    {
        cout << myArray[i];
        i++;
    }
    cin.ignore();
    return 0;
}

Espero ter ajudado um pouco.

Exemplo de um programa em C que resolve um problema similar via argumentos em linha de comando de main.


# arquivo makefile
CC=gcc
CFLAGS=-O3 -Wall -std=c11

SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)
EXE=prog

all: $(EXE)

$(EXE): $(OBJ)
    $(CC) $(OBJ) -o $@ $(CFLAGS)

%.o: %.c
    $(CC) -o $@ -c $^ $(CFLAGS)

.PHONY: clean

clean: 
    rm *.o

// programa C
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ARRAY_SIZE 25 // mude para 1000 em seu problema
#define MAX_WORD_SIZE 25  // mude para o tamanho máximo que um elemento pode ter

// interfaces

inline int pastArrayEnd(char[MAX_ARRAY_SIZE][MAX_WORD_SIZE], int, int);

// implementações

int cmp(const void *a, const void *b) {
  return -1 * strcmp((char*) a, (char*) b);
}

inline int pastArrayEnd(char array[MAX_ARRAY_SIZE][MAX_WORD_SIZE], int max, int index) {
  return (index >= max || strcmp(array[index], "") == 0);
}

int tailPrinting(char array[MAX_ARRAY_SIZE][MAX_WORD_SIZE], int max, int index) {
  if (pastArrayEnd(array, max, index))
    return index;
  else {
    printf(
      "%s%s%s", 
      index == 0 ? "itens: " : "", 
      array[index], 
      !pastArrayEnd(array, max, index + 1) ? ", " : "\n"
    );

    return tailPrinting(array, max, index + 1);
  }
}

int main(int argc, char *argv[]) {
  char array[MAX_ARRAY_SIZE][MAX_WORD_SIZE] = { "" };

  int index = 0;
  for (int i = 0; i + 1 < argc && i < MAX_ARRAY_SIZE; i++, index++) {
    strncpy(array[i], argv[i + 1], MAX_WORD_SIZE - 1);

    if (strlen(argv[i + 1]) >= MAX_WORD_SIZE - 1)
      array[i][MAX_WORD_SIZE - 1] = '\0';
  }

  // ordena inversamente os elementos
  qsort(array, index, MAX_WORD_SIZE, cmp);

  tailPrinting(array, MAX_ARRAY_SIZE, 0);

  return 0;
}

Exemplo de entrada via terminal:

./prog banana pêra maçã abacaxi amora mirtilo manga laranja tangerina uva pessêgo

Saída:

itens: uva, tangerina, pêra, pessêgo, mirtilo, maçã, manga, laranja, banana, amora, abacaxi