Jump to content
uaga

Dúvida sobre array de caracteres

Recommended Posts

uaga

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

int main ()
{
  char entrada[100];
  int i;
  printf("Insere: ");
  gets(entrada);
  for (i = 0; i < strlen (entrada); i++){
  if (entrada[i] == 'a' || entrada[i] == 'A' || entrada[i] == 'b' || entrada[i] == 'B')
  printf("É válida.\n");    
  else
  printf("Não é válida.\n");
}
return 0;
}

Escrevi esta função com o intuito de receber uma string e dizer que essa mesma é válida se apenas contiver a's ou A's e b's ou B's, e não é válida se pelo menos um caracter dessa string não for 'a' nem 'b'. Quando testo na consola acontece isto:

Input: lala

Output:

Não é válida.

É válida.

Não é válida.

É válida.

O que altero no código de forma a que baste um caracter que não seja 'a' nem 'b' para colocar o output em não válido, pois eu não pretendo que me dê um resultado para cada caracter, mas sim apenas um para a string toda. Ou seja quando inserido o input: lala o output deverá ser: Não é válida.

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
pmg

O printf do teu codigo esta dentro do ciclo.

Tens que reestruturar o codigo de modo a pores o printf fora do ciclo (possivelmente com ajuda duma variavel para controlar se o input é ou nao valido)

PS a funcao gets() é impossivel de ser usada com seguranca. Tenta mudar o teu codigo para usar uma alternativa (por exemplo: fgets()).

  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Marzkor

Ou podes Negar o

 if (entrada == 'a' || entrada == 'A' || entrada == 'b' || entrada == 'B')

Edited by brunoais
  • Vote 1

Share this post


Link to post
Share on other sites
uaga

Muito agradecido pelas respostas desde já,

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

int main ()
{
  char entrada[100];
  int i;
  char auxiliar[100];
  printf("Insere: ");
  fgets(entrada,100,stdin);
  for (i = 0; i < strlen (entrada); i++){
  if (entrada[i] != 'a' || entrada[i] != 'A' || entrada[i] != 'b' || entrada[i] != 'B')
  auxiliar[100]="Não é válida";    
  else
  auxiliar[100]="Não é válida";
}
printf("%s\n",auxiliar);
return 0;
}

Sei que existem erros neste passo, a minha dúvida é como dizer que este auxiliar adquire esta string como um novo dado? (Estou a tentar criar uma variável para armazenar o valor do resultado.)

auxiliar[100]="Não é válida";

else

auxiliar[100]="Não é válida";

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
pikax

podes criar uma funcao para receber o valor e retornas o resultado(valida ou invalida)

int verifica(int num, char alpha)
{
 for(int i=1;i<num;i*=10)
 if((num/i)%10 == (alpha-'\0'))
    return 1;
 return 0;
}

int main()
{
 int num;
 scanf("%d",num);
 if(verifica(num,'1')
 printf("contem o numero 1");
 return 1;
}

ou assim:

int main()
{
 int num;
 int flag = 0;
 scanf("%d",num);
 for(int i=1;i<num;i*=10)
 if((num/i)%10 == (alpha-'0'))
 {
    flag = 1;
 }
 if(flag)
 {
 printf("contem");
 }
 else
 {
 printf("nao contem");
 }
 return 1;
}

Ja' agora usei um exemplo completamente diferente, para nao lhe dar a resposta certa, mas sim para ver se ele compreende.

Edited by pikax
  • Vote 1

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
pmg

A maneira mais pratica, a meu ver, de fazer o que queres, 'e inicializar a varaivel auxiliar com um valor e mudar esse valor no ciclo com um if.

No fim do ciclo, a variavel ou tem o valor da inicializacao ou o valor do if

char auxiliar[100] = "linha e valida";
for (i = 0; i < strlen (entrada); i++) {
 if (...) {
   strcpy(auxiliar, "linha nao e valida");
   // possivelmente break para acabar o ciclo cedo
 }
}
printf("%s\n", auxiliar);

Nota que o teu if 'e sempre verdade. Um caracter ou e diferente de 'a' ou diferente de 'b' ...

  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

simples e directo :

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

int main(void) {
 int c; // editado após a nota do @pmg

 printf("Insira a frase :\n");
 while ((c = getchar()) != '\n')
 {
   if (tolower(c) != 'a' && tolower(c) != 'b')
   {
     printf("Frase invalida\n");
     return -1;
   }
 }

 printf("Frase valida\n");
 return 0;
}

Edited by HappyHippyHippo
  • Vote 1

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

Share this post


Link to post
Share on other sites
pmg

simples e directo :

 char c;

c devia ser int :)

Edited by pmg
  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

c devia ser int :)

pois ... esqueço-me sempre que o raio da função retorna o EOF ...

  • Vote 1

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

Share this post


Link to post
Share on other sites
Marzkor
Em 3/13/2013 às 23:30, HappyHippyHippo disse:

simples e directo :


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

int main(void) {
 char c;

 printf("Insira a frase :\n");
 while ((c = getchar()) != '\n')
 {
if (tolower(c) != 'a' && tolower(c) != 'b')
{
  printf("Frase invalida\n");
  return -1;
}
 }

 printf("Frase valida\n");
 return 0;
}
 

Foi esta a logica que tinha no meu post, mas n sei pq fizeram edit!

Assim n é necessário var aux.

  • Vote 1

Share this post


Link to post
Share on other sites
uaga

Agradeço muito terem-me respondido, e assim contribuído para que eu avance um pouco mais na minha aprendizagem, e penso que já percebi que necessito de uma variável auxiliar para me ajudar a guardar o valor que pretendo. Agradeço também as funções colocadas aqui (sei que algumas já executam exactamente aquilo que eu quero) e assim vou tentar corrigir a que tinha iniciado e que continha erros no sentido de apresentar o que eu queria, pois só assim consigo não voltar a ter dúvidas nisto. Muito obrigado mais uma vez.

Share this post


Link to post
Share on other sites
uaga

Fiz assim mas quando coloco a no input, no output sai: Não é válida. O que está errado?

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

int main ()
{
  char entrada[100];
  int i;
  char auxiliar[100] = "É valida.";
  printf("Insere: ");
  fgets(entrada,100,stdin);
  for (i = 0; i < strlen (entrada); i++){
  if (entrada[i] != 'a' || entrada[i] != 'A' || entrada[i] != 'b' || entrada[i] != 'B')
  strcpy(auxiliar, "Não é válida.");
}
printf("%s\n",auxiliar);
return 0;
}

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Fiz assim mas quando coloco a no input, no output sai: Não é válida. O que está errado?

Nota que o teu if 'e sempre verdade. Um caracter ou e diferente de 'a' ou diferente de 'b' ...

olha bem para a condição:

imagina que entrada[i] é 'a'
if (entrada[i] != 'a' || // <---- qual o resultado desta comparação ?
   entrada[i] != 'A' || // <---- qual o resultado desta comparação ? 
   entrada[i] != 'b' || // <---- qual o resultado desta comparação ?
   entrada[i] != 'B')   // <---- qual o resultado desta comparação ?

// qual o resultado da combinação dos 4 resultados com o operador || (ou) ?
{
 // ...
}

  • Vote 1

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

Share this post


Link to post
Share on other sites
pmg

Quando metes a no input, o teu programa vai receber em entrada uma string com comprimento 2: o primeiro caracter é 'a', o segundo caracter é '\n'

O teu if vai primeiro comparar o entrada[0] (o 'a') com aqueles ORs todos. A primeira comparacao dá falso; a segunda comparacao dá verdade ('a' != 'A'), por isso copia "Não é valida." para a variavel auxiliar.

O mesmo com '\n'.

  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
uaga

imagina que entrada[i] é 'a'

if (entrada[i] != 'a' || // <---- qual o resultado desta comparação ? falso

entrada[i] != 'A' || // <---- qual o resultado desta comparação ? verdade

entrada[i] != 'b' || // <---- qual o resultado desta comparação ? verdade

entrada[i] != 'B') // <---- qual o resultado desta comparação ? verdade

// qual o resultado da combinação dos 4 resultados com o operador || (ou) ?

{

// Verdadeiro?

}

Edited by uaga

Share this post


Link to post
Share on other sites
HappyHippyHippo

imagina que entrada é 'a'

if (entrada != 'a' || // <---- qual o resultado desta comparação ? verdade

entrada != 'A' || // <---- qual o resultado desta comparação ? falso

entrada != 'b' || // <---- qual o resultado desta comparação ? falso

entrada != 'B') // <---- qual o resultado desta comparação ?falso

// qual o resultado da combinação dos 4 resultados com o operador || (ou) ?

{

// Verdadeiro?

}

exacto ... verdadeiro, logo a mensagem será sempre apresentada

em vez de ter que ser diferente de algum para apresentar a mensagem, tu queres que seja diferente de todos


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

Share this post


Link to post
Share on other sites
uaga

Penso que já percebi, para a instrução daquele if não ser executada, o if tem que dar falso, mas só dará falso se for tudo falso, não é?

Share this post


Link to post
Share on other sites
HappyHippyHippo

Penso que já percebi, para a instrução daquele if não ser executada, o if tem que dar falso, mas só dará falso se for tudo falso, não é?

sim

para resolver o problema, pensa ao contrário.

só queres apresentar a mensagem se a(s) condição(ões) do if resultar em verdadeiro


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

Share this post


Link to post
Share on other sites
uaga

Se eu colocasse no if que entrada != de cada letra do alfabeto que não o 'a' nem o 'b' talvez funcionasse? Embora seja exaustivo demais...

Share this post


Link to post
Share on other sites
HappyHippyHippo

Se eu colocasse no if que entrada != de cada letra do alfabeto que não o 'a' nem o 'b' talvez funcionasse? Embora seja exaustivo demais...

obviamente

logo deverá existir uma solução mais elegante

não conheces outros operadores ?


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

Share this post


Link to post
Share on other sites
uaga

Sei que existe o | | - ou, && - e, != - diferente; Tenho que usar um destes? Pelo menos neste momento não descubro uma maneira mais eficaz de fazer isto com estes a não ser esta...

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz assim

altera o operador por aquele que sabes e faz o mesmo exercício que te apresentei uns post atrás : calcula o resultado de cada comparação e depois a sua combinação

  • Vote 1

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

Share this post


Link to post
Share on other sites
BrunoT

A condição no IF está errada, pensa um bocado que chegas lá. Mas isso não te resolve o problema por causa do \n que o fgets põe. Ele vai comparar com o \n e entra no if, tens que por este código

entrada[strlen(entrada)-1] = '\0';

a seguir ao fgets.

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
uaga

Muito obrigado, problema resolvido, bastou mudar os || para os && e inserir entrada[strlen(entrada)-1] = '\0';.

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.