Ir ao conteúdo
  • Cadastre-se

C Um programa para guardar uma frase


Joel Martins
Ir à solução Resolvido por Midori,

Posts recomendados

O meu objetivo era criar um programa para guardar um texto e ver se as strings ab e AB estão presentes no texto e se estiverem quantas vezes estão.

#include<stdio.h>

void main()
{
    int i , o=0;
    char texto[30];

    printf("creat a text(to finish press ENTER):\n      ");
    scanf("%s", &texto);
    
    for(i=30 ; i>=0 ; i--)
    {
        switch(texto[i])
        {
            case 'ab':
                o++;
            case 'AB':
                o++;
        }
    }
    printf("No texto criado as string's ab ou AB repetem-se %d vezes.",o);
}

Já consegui fazer isto, alguem me pode ajudar a acabar?

Obrigado☺🥂

Link para o comentário
Compartilhar em outros sites

@Joel Martins Não dá para testar strings dessa forma, para contar as ocorrências você pode pegar as posições dos caractere no texto assim,

 

//...
char anterior = texto[i - 1];
char letra = texto[i];

if(anterior == 'a' && letra == 'b'){
    conta += 1;
}
//...

 

Strings em C terminam com o caractere 0 então você pode usar isso para terminar o loop. Da forma como fez está esperando que a entrada sempre será do tamanho alocado. Considerando o trecho que postei poderia começar o loop da posição 1 até o fim do texto,

 

for(i = 1 ; texto[i] ; i += 1)

 

Para a entrada de strings com scanf não é necessário o operador &,

scanf("%s", texto);

 

Mas em vez de scanf também poderia usar fgets que limita o tamanho do texto e já aceita espaço,

fgets(texto, 30, stdin);

 

Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Midori disse:

Não dá para testar strings dessa forma, para contar as ocorrências você pode pegar as posições dos caractere no texto assim,

Mas este é o objetivo do exercício.

Elabore um programa que calcule e mostre o número de vezes que a string AB aparece num texto.

Link para o comentário
Compartilhar em outros sites

@Joel Martins Veja p.ex o warning do compilador ao compilar o seu programa,

 

main.c:15:18: warning: multicharacter character constant [-Wmultichar]

main.c:15:13: warning: case label value exceeds maximum value for type

 

A linha 15 é no case 'ab'. Você está tentando testar um caractere (texto[i] retorna um caractere) com uma string, essa não é forma correta. Tentou fazer como comentei?

Link para o comentário
Compartilhar em outros sites

@Midori Assim?

#include<stdio.h>

void main()
{
    int i , o=0;
    char texto[30];

    printf("creat a text(to finish press ENTER):\n      ");
    scanf("%s", texto);

    for(i=0 ; i<30 ; i++)
    {
        switch(texto[i])
        {
            case 'a && b':
                o++;
            case 'A && B':
                o++;
        }
    }
    printf("In the created text, the string's ab or AB appear %d times.",o);
}

 

Link para o comentário
Compartilhar em outros sites

@Joel Martins Algo assim,

 

#include <stdio.h>

int main(){
    int i;
    int conta = 0;
    char texto[30];

    printf("Texto: ");
    fgets(texto, 30, stdin);

    for(i = 1; texto[i] != 0; i += 1){
        char A = texto[i - 1];
        char B = texto[i];
        
        if(A == 'a' && B == 'b'){
            conta += 1;
        }        
    }
    printf("Ocorrencias de 'ab' = %d\n", conta);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

30 minutos atrás, Joel Martins disse:

Mas eu estava a tentar resolver com case.

Sim, mas você tem que testar dois valores e o switch só recebe um por ciclo. Entenda que seu switch está recebendo UM char (uma letra) então não faz sentido case 'a && b' ou case 'ab'. Além disso aspas simples só é para ser usada com um caractere... Veja os warnings do seu compilador.

Link para o comentário
Compartilhar em outros sites

@Midori

#include<stdio.h>

void main()
{
    int i , o=0;
    char texto[30];

    printf("creat a text(to finish press ENTER):\n      ");
    scanf("%s", &texto);

    for(i=0 ; i<30 ; i++)
    {
        if(texto[i]=="ab")
            o++;
            else
            if(texto[i]=="ab")
                o++;
    }
    printf("In the created text, the string's ab or AB appear %d times.",o);
}

Assim?

Link para o comentário
Compartilhar em outros sites

@Joel Martins Não se pode compara strings dessa maneira em C, a "melhor maneira" seria assim.

#include <stdio.h>
#include <string.h>

#define T_STR 256

int
contaOcorrencia(char *str, char *oc);

int main(int argv, char *argc[])
{
    char str[T_STR], palavra[T_STR];
    if (argv > 1) {
        strcpy(str, argc[1]);
        strcpy(palavra, argc[2]);
    } else {
        printf("\nDigite uma palavra:\t");
        fgets(str, T_STR, stdin);
        printf("\nDigite a ocorrencia na palavra:\t");
        fgets(palavra, T_STR, stdin);
        /* Retira o newline */
        str[strlen(str)-1] = palavra[strlen(palavra)-1] = '\0';
    }

    printf("\nQuantidade de ocorrencias da palavra %s na palavra %s:%i",
            palavra, str, contaOcorrencia(str, palavra));
            
    getchar();      /* pausa o programa */
    return(0);
}

int
contaOcorrencia(char *str, char *oc)
{
    unsigned short 
    t_str = strlen(str),
    t_oc = strlen(oc)-1,
    ocorrencias = 0;

    char tmp[T_STR];

    if (t_str > 0 && t_oc > 0) {
        unsigned short cont = 0;
        do {
            if (cont < t_str) {
                strcpy(tmp, &str[cont]);
                tmp[t_oc+1] = '\0';
                if (strcmp(tmp, oc) == 0) {
                    cont+=t_oc;
                    ocorrencias++;
                } else {
                    cont++;
                }
            }
        } while (cont < t_str);
        return(ocorrencias);
    }
    return(0);
}

 

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, kgin disse:

strcpy

 

1 minuto atrás, kgin disse:

tmp[T_STR]

 

1 minuto atrás, kgin disse:

strcpy

 

1 minuto atrás, kgin disse:

str[T_STR], palavra[T_STR];

Peço desculpa mas não sei e ainda não aprendi a trabalhar com este tipo de coisas poderia fazer por um metodo mais simples?Desulpe e obrigado

Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, Joel Martins disse:

Assim?

Você continua tentando comparar char com string (string é uma sequencia de caracteres, dois ou mais caracteres).

 

Durante o loop o vetor texto[i] retornará apenas UM caractere do texto, então não tem sentido tentar algo assim.

 

if(texto[i]=="ab")

 

Em C não dá para comprar strings assim, mas mesmo se fosse possível isso estaria errado já que texto[i] sempre retornará um caractere por vez.

 

Veja que neste código só faço a comparação entre caracteres. Faça um teste e veja o resultado,

 

#include <stdio.h>

int main(){
    int i;
    int conta = 0;
    char texto[30];

    printf("Texto: ");
    fgets(texto, 30, stdin);

    for(i = 1; texto[i] != 0; i += 1){
        char A = texto[i - 1];
        char B = texto[i];

        if(A == 'a' && B == 'b'){
            conta += 1;
        }        
        if(A == 'A' && B == 'B'){
            conta += 1;
        }        
    }
    printf("Ocorrencias de 'ab' ou 'AB' = %d\n", conta);
    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!