Jump to content

Problema com string.


thamer

Recommended Posts

Olá pessoal, tudo bem?

Segue o problema:

O usuário vai informar uma string e uma letra. Logo após, o programa deve ler ambos e, caso a letra conter na string, deve repetir a letra até encontrar a mesma (letra) ou até terminar a string.

Ex:

Palavra - Banana;

Letra - a;

Resultado: Baaana

Ex2:

Palavra - Carro

Letra - r

Resultado: Carrr

Ex3:

Palavra - Andar

Letra: a

Resultado: aaaar

O que desenvolvi até agora (só para mostrar que não sou um folgado):

#include<stdio.h>
#include<conio.h>
#define tam 20

main(void){
	   char str[tam], letra;
	   int i;
	   printf("Digite a letra: ");
	   scanf("%c", &letra);
	   printf("Digite a string: ");
	   gets(str);
	   for(i=0; i<tam; i++){

Sim, estou aprendendo lógica e programação a partir da linguagem C.

Tenho problemas com a parte lógica e, aproveitando o tópico, caso tenham alguma sugestão para aprimorar meu modo de pensar, eu ficaria grato.

Se quiserem dar apenas dicas, seria mais interessante.

Grato!

Link to comment
Share on other sites

Pelo segundo exemplo, tens que ter em atenção que se as letras forem consecutivas, não conta.

Basicamente utilizas uma variável de estado que indica se deves substituir ou não os caracteres. Para resolveres aquilo que disse antes podes, ou calcular a partir da posição do primeiro char encontrado, ou utilizares outra variável de estado para indicar se já substituiste pelo menos um char (e mudas assim que substituires o primeiro).

Agora, tens que ter atenção a uma coisa. Tu tens um array de chars com tamanho 20, mas a tua string pode ser menor que esses 20 chars. Se ignorares isso, podes vir a preencher casas que não fazem parte da string. Podes resolver isso se verificares se a casa tem o char \0. E se o útilizador escrever uma palavra com mais de 20 chars, mesmo terminando a verificação na última casa do array, não estás a limitar a quantidade de informação lida pelo scanf, o que te pode fazer ultrapassar o limite de espaço que tens reservado para o input do utilizador.

  • Vote 1

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//#include<conio.h>             <--- não uses isto por favor
#define TAM 20

enum {
 Ler,
 Inicio,
 Substituir
} Estado;

int main(void){                 // <--- falta o valor de retorno da função main (int)
 char str[TAM], letra;
 Estado estado = Ler;
 int i;

 printf("Digite a letra: ");
 scanf("%c", &letra);
 printf("Digite a string: ");
 fgets(str, TAM, stdin);       // <--- é sempre melhor usar a função fgets do que a gets

 for(i=0; i<strlen(str); i++){ // <--- irás iterar de 0 até ao tamanho da string
   switch (estado)             // <--- verificar o estado actual
   {
   case Ler:
     if (str[i] == letra)      // <--- se estiveres a ler o carater e encontrares a letra irás passar para o estado de começar
       estado = Inicio;
     break;
   case Inicio:
     if (str[i] != letra)      // <--- se estiveres a começar a substituir e encontrares uma letra diferente irás começar a substituir 
     {
       estado = Substituir;
       str[i] = letra;         // <--- não esquecer de subtituir a letra diferente encontrada
     }
     break;
   case Substituir:
     if (str[i] != letra)
       str[i] = letra;         // <--- se for diferente, substitui a letra encontrada
     else
       estado = Ler;           // <--- se for igual, passas ao estado de ler
     break;
   }
 }

 // apresentação do resultado
 printf("resultado : %s\n", str);
 return 0;
}

a única razão porque te escrevi o código foi porque como estás a começar, uma máquina de estado pode ser um bocado complicado, não esperes este tipo de ajudas muitas vezes

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.