Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Vertygo

Contar carateres em vetor com várias linhas (vetor contém \n)

Mensagens Recomendadas

Vertygo

Boa tarde!

Sou membro recente do forum, recomendado por Colega de curso, e sou ainda verde em matéria de C.

Estou perante uma situação em que não consigo aferir o nº de caracteres contidos numa string, e tudo isto aparentemente porque a string tem várias linhas.

Consigo obter a contagem de linhas, vogais e etc, mas no que toda a caracteres (todos incluindo os espaços e especiais), apenas devolve os da 1ª linha.

Utilizo a strlen frequentemente para manipular strings, mas de facto nunca o fiz para conjuntos tão volumosos com é  caso (cerca de 150 linhas, com aproximadamente 50 carateres em cada uma).

Já tentei utilizar o EOF (end of file) para o strlen ler todo o stdin recebido até ao final, mas o meu resulta é sempre o mesmo... apenas consigo contar a 1ª linha e dados.

Algém consegue "ver" o que está errado?

A entrada de dados é por stdin, e serve com exemplo a string infra:

                     Código

                     Linguagem

                     Programa

                     Instrução

                     Atribuição

                    (...)

 

Eis o que tenho atualmente (apenas parte, pois na contagem do "resto", está ok)

 

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#define MAXTEXT 10000

// função para contagem de linhas, vogais, consoantes e caracteres que cruza a
// string introduzida com os vetores de vogais e consoantes


void quantidade(char *texto, int contador) {
  char consoante[43] = {'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N',
                        'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'b',
                        'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p',
                        'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'};

  char vogal[11] = {'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'};
  int i, j, k, l, vogais = 0, consoantes = 0, carEspecial = 0, numLinhas = 0, count = 0;


    contador = strlen(texto);

        while (fgets(texto, MAXTEXT, stdin) != NULL) {
      numLinhas++;

      for (i = 0; i < contador; i++) {
        for (j = 0; j < 11; j++) {

          if (texto == vogal[j]) {
            vogais++;
          }
        }
      }

      for (k = 0; k < contador; k++) {
        for (l = 0; l < 43; l++) {

          if (texto[k] == consoante[l]) {
            consoantes++;
          }
        }
      }
    }

    printf("%d", numLinhas);
    printf(" %d", contador); /* »»»» AQUI RESIDE O ERRO «««« Conta-me apenas os caracteres da 1ª linha, e não todas as linhas lidas no stdin*/
    printf(" %d", consoantes);
    printf(" %d", vogais);
}


int main() {
  char texto[MAXTEXT];
  int contador, count;
  fgets(texto, MAXTEXT, stdin);
  quantidade(texto, contador);
  return 0;
}


 

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Quando usas o fgets com a stream stdin, só a primeira linha é lida pois o terminal, o qual é o intermediário entre o utilizador e o programa, considera que o Enter é o fim de inserção de dados e passa o "controlo" ao programa, o qual lê do buffer de input os caracteres inseridos, #10 incluído.

Portanto, o strlen está a funcionar.

Se os dados de entrada são mesmo do stdin, precisas de criar uma função que leia uma sequência de linhas e crie uma string única, o que pode não ser considerado ideal (possivelmente faria um vector de strings).

Cumprimentos.

  • Voto 1

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
9 hours ago, thoga31 said:

Quando usas o fgets com a stream stdin, só a primeira linha é lida pois o terminal, o qual é o intermediário entre o utilizador e o programa, considera que o Enter é o fim de inserção de dados e passa o "controlo" ao programa, o qual lê do buffer de input os caracteres inseridos, #10 incluído.

Portanto, o strlen está a funcionar.

Se os dados de entrada são mesmo do stdin, precisas de criar uma função que leia uma sequência de linhas e crie uma string única, o que pode não ser considerado ideal (possivelmente faria um vector de strings).

Cumprimentos.

Obrigado pela dica thoga!

Mas quando pesquisei, verifiquei que posso usar a fgests funciona com a stdin, se colocar a condição "!=NULL", supostamente lê até ao fim dos dados...

Quando executo o bloco em baixo, dáme corretamente a contagem de linhas:

while (fgets(texto, MAXTEXT, stdin) != NULL) {

numLinhas++;

(...)

Se entretanto utilizar o "!=EOF", o codigo nem corre.

Tou mesmo a desatinar com isto. Dá-me o numero de linhas, mas depois não me dá o numero de carateres em todas elas, e apenas me informa da 1ª linha.

Editado por Vertygo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

bem ... como a maior parte do problema está feito, não estou a ver razão para apresentar a solução para este problema específico

#include <stdio.h>
#include <ctype.h>

#define BUFFER_SIZE 10

int main() {
    char buffer[BUFFER_SIZE];
    size_t readed = 0, count = 0;

    do {
        count += readed = fread(buffer, 1, BUFFER_SIZE, stdin);
    } while (readed == BUFFER_SIZE);

    printf("number of bytes : %lu\n", count);

    return 0;
}

 

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo
1 hora atrás, HappyHippyHippo disse:

bem ... como a maior parte do problema está feito, não estou a ver razão para apresentar a solução para este problema específico

s/readed/bytes_read/ :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.