Jump to content
Vertygo

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

Recommended Posts

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;
}


 

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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.

  • Vote 1

Knowledge is free!

Share this post


Link to post
Share on other 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.

Edited by Vertygo

Share this post


Link to post
Share on other 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;
}

 

  • Vote 1

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
HappyHippyHippo
1 minute ago, pwseo said:

s/readed/bytes_read/ :P

#toomanyunderscores


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

Share this post


Link to post
Share on other sites
pwseo
1 minuto atrás, HappyHippyHippo disse:

#toomanyunderscores

mas readed é ungood xD

Share this post


Link to post
Share on other sites
HappyHippyHippo
Just now, pwseo said:

mas readed é ungood xD

but it should


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.