Ir para o conteúdo
uaga

Dúvida sobre array de caracteres

Mensagens Recomendadas

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.

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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()).

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marzkor

Ou podes Negar o

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

Editado por brunoais
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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";

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por pikax
  • Voto 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."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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' ...

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Editado por HappyHippyHippo
  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

simples e directo :

 char c;

c devia ser int :)

Editado por pmg
  • Voto 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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) ?
{
 // ...
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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'.

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

}

Editado por uaga

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 é?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por brunoais
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.