Ir ao conteúdo
  • Cadastre-se

C Fazer string em c


Posts recomendados

Ler uma string de no máximo 50 caracteres e em seguida um caractere (entre A e z - consista se o caracter esta nesse 
intervalo), mostrar quais as posições esse caractere (maiúscula ou minúscula) na string lida e quantas vezes ele apareceu

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

int main()
{
    setlocale(LC_ALL,"portuguese");

    char frase[50];
    char carac;
    char letra[50];
    int i=0;

    printf("Digite uma frase\n");
    fflush(stdin);
    gets(frase);

    printf("Digite um caracter de Aa a Zz: \n");
    fflush(stdin);
    scanf("%c",&carac);


     while ((frase[i] >= 'a' && frase[i] <= 'z') ||
                (frase[i] >= 'A' && frase[i] <='Z'))


    for (i=0; i<strlen(frase); i++)

    {
        if (frase[i] == carac)

        {
            printf("As posições são: %d\n",i);


            i++;


            printf("A quantidade da letra %d \n,",carac);

        }


    }

    return 0;
}

 

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

@Loyanne Medrado     para validar o caractere digitado , se está nessa faixa ,  você pode usar o código ASCII dos caracteres como condição para repetir ou não , pois esse seu while não está fazendo nada ,  e também ao incrementar a variável  i  ,  afeta as comparações , pois pula um caractere , já que o for já faz uma incrementação , passando para o caractere na próxima posição , e no seu código ficou faltando mostrar o número de vezes que o caractere saiu na string ,  e para ler do teclado é melhor usar o comando fgets , pois com ele não precisa do fflush , já que ele não foi criado para limpar o buffer do teclado , e para isso seria melhor usar o fgetc ,  e em uma função , e acentuações não funcionam bem e é melhor nem tentar usar , e então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void            _Meu_Fflush();
int main()
{
    char frase[50], carac, letra[50];
    int i,cont=0;
    printf("Digite uma frase ");
    fgets(frase,49,stdin);
    do{
        printf("Digite um caracter de Aa a Zz: ");
        carac = fgetc(stdin);
        _Meu_Fflush();
    }while(carac < 65 || carac > 122 || (carac > 90 && carac < 97));
    for (i=0; frase[i]!='\0'; i++)
    {
        if (frase[i] == carac)
        {
            printf("O Caractere %c Apareceu Na posição : %d\n",carac,i);
            cont++;
        }
    }
    printf("\nA quantidade da vezes que a letra %c apareceu Foi %d Vezes\n,",carac,cont);
    return 32768;
}
void            _Meu_Fflush()
{
    char c;
    while( c = fgetc(stdin) != '\n');
}

 

Link para o comentário
Compartilhar em outros sites

9 horas atrás, Loyanne Medrado disse:

printf("Digite uma frase\n");
    fflush(stdin);
    gets(frase);

 

Existem muitas *formas de se fazer isso: menos ou mais analática em cada solução

 

Fases

1- Ler uma ‘string’ de no máximo 50 caracteres.

2- E em seguida um caractere (entre A e z - consista se o caractere esta nesse intervalo),

3- Mostrar quais as posições esse caractere (maiúscula ou minúscula) na string lida

4- E quantas vezes ele apareceu

"

 

* Problema na linguagem de programação C é que existem muitas maneiras de se fazer a mesma coisa e todas elas são formas corretas, por exemplo, existem muitas maneiras e se lê uma “string”: gets, fgets, scanf, getline, getdelim, read.

 

C11 -  lendo com gets

	char *prompt= NULL;

	puts ("\nPor favor, entre com string"),
	prompt= gets ((char [BUFSIZ]){"..."}),
	prompt [50]= '\0',

	puts ("\nResultado"),
	puts (prompt);

 

Observação: gets há anos é marcada como desatualizada, porém funciona, e funcionará penso que por +12 anos.

 

Quando diz: Ler uma ‘string’ de no máximo 50 caracteres

— Deseja-se um vetor de capacidade de +50 caracteres (char), mas com tamanho max. 50, algo que 'gets' não garante. Não importa para ela, tudo que tiver na linha será lido, inclusive uma “string” com mais de 50 caracteres.

"

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

 Como citado acima é melhor usar fgets que também é uma função mais segura que gets por limitar a quantidade caracteres.

 

#include <stdio.h>

int main(){
    char frase[50], c;
    int i=0, qtd=0;
    
    printf("Frase: ");
    fgets(frase,50,stdin);
    printf("Caractere [entre Aa-Zz]: ");
    c = fgetc(stdin);
    printf("\nPosicoes: ");
    
    while(frase[i++]){
        if(frase[i]==c){
            printf("%d,",i+1);
            qtd++;
        }
    }
    printf("\n\nQuantidade = %d\n",qtd);
    return 0;
}

 

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

Uma possível solução poderia ser assim:

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

#define MAXIMO 50

/**
 * Exibe o relatorio com os resultados.
 *
 * @param frase      Frase.
 * @param letra      Letra que foi pesquisada.
 * @param tamanho    Quantidade de letras da frase.
 * @param ocorrencia Quantidade de ocorrencias.
 * @param posições   Vetor com as posições das ocorrencias.
 */
void exibirRelatorio(char *frase, char letra, int tamanho, int ocorrencia, int *posições) {
    printf("                  1         2         3         4          (dezena) \n");
    printf("Indice: 01234567890123456789012345678901234567890123456789 (unidade) \n");
    printf(" Frase: %-50s Letra: %c \n", frase, letra);

    printf("        ");

    for (int i = 0; i < tamanho; ++i) {
        int achou = 0;

        for (int j = 0; j < ocorrencia && achou == 0; ++j) {
            if (i == posições[j]) {
                printf("|");
                achou = 1;
            }
        }

        if (achou == 0) {
            printf(" ");
        }
    }

    printf("\n\n");

    printf("Ocorrencia: %i \n", ocorrencia);
    printf("  posições: [");

    // Imprime o vetor de forma legivel
    for (int i = 0; i < ocorrencia; ++i) {
        printf("%i", posições[i]);

        if (i + 1 < ocorrencia) {
            printf(", ");
        }
    }

    printf("] \n");
}

/**
 * Pega os dados do usuario.
 *
 * @param frase Frase.
 * @param letra Letra para pesquisar.
 */
void pegarDados(char *frase, char *letra) {
    printf("Digite a frase: ");
    fgets(frase, MAXIMO, stdin);
    frase[strlen(frase) - 1] = '\0';

    do {
        printf("Digite a letra de pesquisa: ");
        scanf(" %c%*c", letra);
    } while (!(*letra >= 'A' && *letra <= 'Z') && !(*letra >= 'a' && *letra <= 'z'));
}

/**
 * Realiza a pesquisa.
 *
 * @param frase      Frase.
 * @param letra      Letra que sera pesquisada.
 * @param tamanho    Quantidade de letras da frase.
 * @param ocorrencia Onde sera armazenada a quantidade de ocorrencias.
 * @param posições   Onde sera armazenada as posições das ocorrencias.
 */
void pesquisar(char *frase, char letra, int tamanho, int *ocorrencia, int *posições) {
    for (int i = 0; i < tamanho; ++i) {
        if (_toupper(frase[i]) == _toupper(letra)) {
            posições[*ocorrencia] = i;
            *ocorrencia += 1;
        }
    }
}

int main() {
    int ocorrencia = 0;
    int tamanho = 0;
    int posições[MAXIMO] = {0};

    char frase[MAXIMO] = "";
    char letra = ' ';

    pegarDados(frase, &letra);
    tamanho = (int) strlen(frase);

    pesquisar(frase, letra, tamanho, &ocorrencia, posições);
    exibirRelatorio(frase, letra, tamanho, ocorrencia, posições);

    return EXIT_SUCCESS;
}

 

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

Quanta complicação para um problema simples...

@Loyanne Medrado Olá,

Segue exemplo em código de uma possível resolução:

#include <stdio.h>

int
main()
{
	int sizes = 50; // Tamanho maximo da string
	int xpos[sizes]; // Amazena as posições
	int count = 0; // Quantas ocorrencias

	char str[sizes]; // Recebera a string (as input)
	char buff[2]; // Recebera a letra (as input)
	char letter; // Amazenara a letra entre aA-zZ

	printf("\nDigite uma string: ");
	fgets(str, sizes, stdin);
	
	printf("\nDigite um caractere entre aA-zZ: ");
	fgets(buff, 2, stdin);

	// For loop para verificar a letra passada
	for(char * l = buff; *l; ++l)
	{
		if((*l >= 'a' && *l <= 'z')||(*l >= 'A' && *l <= 'Z'))
		{
			letter = *l;
			break;
		}
	}

	// For loop para verificar cada letra da string
	for (size_t i = 0; i < sizes; i++)
	{
		if (str[i] == letter)
		{
			xpos[count] = i; // Marca as posições
			count++; // Adiciona 1 a flag count
		}
	}

	if(count <= 0)
	{
		printf("\nNão econtrado!\n");
		return 1;
	}

	printf("\nEncontrado %d ('%c') em:", count, letter);
	for (size_t x = 0; x < count; x++)
		printf(" %d", xpos[x]);
	
	printf("\n");
	return 0;
}

 

Espero ter lhe ajudado, até mais!

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

2 horas atrás, sannoy disse:


/* ... */
fgets(buff, 2, stdin);

/* ... */
// For loop para verificar a letra passada
for(char * l = buff; *l; ++l) {
	if((*l >= 'a' && *l <= 'z')||(*l >= 'A' && *l <= 'Z')) {
    	letter = *l; break;
}	}

 

Entre FOR e WHILE sou do grupo dos WHILE

 

Falando da (programação) acima,

Se é dito que pega 1 caractere (fgets(buffer, 2, fluxo)) então o conteúdo para "buffer" é "?\0", logo o FOR será ou não otimizado para o IF que é seu conteúdo.

"

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

@mauro_b  Olá,

 

13 minutos atrás, mauro_b disse:

Entre FOR e WHILE sou do grupo dos WHILE

Apenas uma dica, não aconselho fechar sua cabeça desta forma, Em programação depende muito de lógica, vai de cada pessoa (programador e/ou estudante) buscar o que se encaixa melhor logicamente, as vezes pode ser while outras for.

 

Ficar escolhendo por "fanatismo" ou simplesmente por gostar da sintaxe, algumas vezes pode dar uma dor de cabeça para outros dev's que lidarem com seu código no futuro.

 

19 minutos atrás, mauro_b disse:

Falando da (programação) acima,

Se é dito que pega 1 caractere (fgets(buffer, 2, fluxo)) então o conteúdo para "buffer" é "?\0", logo o FOR será ou não otimizado para o IF que é seu conteúdo.

 

Bom, tem diversas formas mais simples(sem e com loop) para este caso, uma possibilidade seria a seguinte:

char * l = buff;
if((*l >= 'a' && *l <= 'z')||(*l >= 'A' && *l <= 'Z'))
	letter = *l;
l = NULL;

 

Claro que depende muito qual lógica você tem em mente mas, como @Loyanne Medrado não especificou que precisaria de um menu ou que repetisse o input, acho que neste caso ficaria aceitável.

 

  • Curtir 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!