Ir ao conteúdo

Posts recomendados

Postado

Escreva um programa para ler uma quantidade indeterminada de frases (considere que cada frase possui no máximo 70 caracteres). Para cada frase imprima a quantidade de espaços em branco que ela contém. O programa se encerra quando for digitada uma frase que não contém espaços em branco.

Minha duvida em relação a questão acima é como fazer para contar os espaços e como sair do loop infinito quando for digitada uma frase que não contém espaços em branco.

Segue o começo do meu código:

#include<stdio.h>
#include <string.h>
#include <conio.h>
int main ()
{
    char pal[70];
    int i, qtd=0;
    printf ("Digite algumas frases:\n");
    for( ; ; ){
        fgets(pal,70,stdin);   
    }
}

 

Postado

Para contar faça outro loop com o incremento de uma variável nos testes da posição com espaço, saia do loop infinito com break se essa variável for igual a zero.

  • Curtir 1
Postado

Faça um loop para percorrer o vetor de char até chegar no fim da string (= quando encontrar o caractere '\0'), e nele cheque se o caractere na posição atual do vetor é um espaço em branco, e incremente um contador se for. (Não esqueça de iniciar para 0 o contador antes de começar percorrer o vetor.

 

Para o programa quando esse contador for igual a 0 depois de percorrer o vetor (o que implica que não encontrou nenhum espaço em branco).

  • Curtir 1
Postado
10 horas atrás, Helio Junnior Sartor Dalmolin disse:

Minha duvida em relação a questão acima é como fazer para contar os espaços e como sair do loop infinito quando for digitada uma frase que não contém espaços em branco.

 

Para sair do tal loop use um break; 

 

Passando disso

 

int main ()
{
    char pal[70];
    int i, qtd=0;
    printf ("Digite algumas frases:\n");
    for( ; ; ){
        fgets(pal,70,stdin);   
    }
}

 

para 

 

int main ()
{
    char pal[70];
    int i, qtd=0;
    printf ("Digite algumas frases:\n");
    for( ; ; )
    {
        fgets(pal,70,stdin);
        if ( condicao ) break;
    }
}

 

No entanto a própria condição poderia já encerrar o loop certo?

 

A quantidade de frases é incerta, mas tem que ler ao menos uma pra ver se tem ALGUMA que não tem espaços em branco. Assim a escolha natural é um do {} while().

 

Algo assim como abaixo mas trocando a atribuição por um loop que identifica quantos brancos tem na string.

 

#include "stdio.h"

int main ()
{
    char    pal[70]={0};
    int     total_brancos = 0;
    do
    {
        printf ("Proxima frase: ");
        fgets(pal,70,stdin);
        total_brancos = 1; // aqui conta os espacos em pal 
        printf("\t%d brancos\n", total_brancos);

    }   while ( total_brancos != 0);
}

 

E como contar os brancos? 

 

Há muitas maneiras, claro.

 

Provavelmente a escolha profissional seria usar o ponteiro retornado por fgets() e seguir até encontrar um zero, afinal é a definição de string em C e já está declarado. E no loop contar os espaços. Nada mais.

 

O ortodoxo é um for variando o índice até o tamanho da string.

 

O comum
 

#include "stdio.h"
#include "string.h"

int main ()
{
    char    pal[70]={0};
    int     total_brancos = 0;
    do
    {
        printf ("Proxima frase: ");
        fgets(pal,70,stdin);
        total_brancos = 0; // aqui conta os espacos em pal 
        for ( int i = 0; i<strlen(pal); i+=1 ) if ( pal[i] == ' ') total_brancos +=1;
        printf("\t%d brancos\n", total_brancos);

    }   while ( total_brancos != 0);
}

 

E está certo. Mas precisa incluir string.h para poder usar strlen().

 

E não há razão para saber o tamanho da string: só precisa saber se tem brancos ou não e onde ela termina.

 

Qualquer compilador razoável vai perceber que pal não é alterada dentro do loop e otimizar isso, chamando strlen() uma vez só. Mas é mérito dele e não de quem escreveu o programa. mesmo que o autor tenha antecipado o que estou explicando ;) 

 

O programa  vai de fato chamar strlen() para cada letra, a menos que o otimizador faça algo.

 

O eficiente
 

#include "stdio.h"
int main ()
{
    char    pal[70]={0};
    int     total_brancos = 0;
    do
    {
        printf ("Proxima frase: ");
        char* p = fgets(pal,70,stdin);
        total_brancos = 0; // aqui conta os espacos em pal 
    	char    c = 0;  
        while ( (c = *p++) != 0 ) if ( c == ' ') total_brancos +=1;
        printf("\t%d brancos\n", total_brancos);

    }   while ( total_brancos != 0);
}

 

fgets() já retorna o ponteiro para o início da string, o zero ao final está garantido, e basta procurar o zero. Ok, pode ter um '\n'nates do zero, só que é melhor testar no if do que testar a condição toda hora.

 

Atende para a necessidade de declarar c  no exemplo ;) 

 

 

 

 

 

E compare com esse aqui
 

#include "stdio.h"
int main ()
{
    char    pal[70]={0};
    int     total_brancos = 0;
    do
    {
        printf ("Proxima frase: ");
        char* p = fgets(pal,70,stdin);
        total_brancos = 0; // aqui conta os espacos em pal 
        while ( *p != 0 ) if ( *p++ == ' ') total_brancos +=1;
        printf("\t%d brancos\n", total_brancos);

    }   while ( total_brancos != 0);
}

 

que faz a mesma coisa

Postado
21 horas atrás, Helio Junnior Sartor Dalmolin disse:

char pal[70];

A capacidade do vetor ainda não é o bastante

para comprimento da ‘string’

21 horas atrás, Helio Junnior Sartor Dalmolin disse:

considere que cada frase possui no máximo 70 caracteres

Capacidade = comprimento (70) + 1; do contrário, para todos os casos que há espaço na posição máxima (70) o algoritmo falha

Se usar o seguinte comando

21 horas atrás, Helio Junnior Sartor Dalmolin disse:

fgetspal 70 stdin );

que captura a linha ou 69 caracteres, o que ocorrer primeiro.

 

Independe..., siga o enunciado capturando o máximo 70 caracteres ou a linha.

fgets( pal , 71 , stdin );

[:)] 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!