Jump to content
BlackSnow

Calcular o numero de letras de uma palavra

Recommended Posts

BlackSnow

Olá de certeza que já se falou disto em algum outro tópico mas eu não estou a encontrar e tenho alguma pressa para obter a resposta.se souberem de um tópico que me possa ajudar agradeço que deixem o link.

O problema é o seguinte:

eu estou a fazer o jogo da forca em C, e preciso saber o numero de letras da palavra para poder introduzir x '_' conforme o numero de letras ate ai tudo bem, usei o strlen para fazer isso.

Mas o problema é que ele esta a contar o enter também e não pretendo isso, já fiz isto :

numletras = strlen(frase);

for(i=0;i<numletras!='\0';i++) // 
{
if (letra == frase[i])
resultado[i] = frase[i];
resultado[i] = '_';
printf("%c ",resultado[i]);
} 

usei o !='\0' pare ser diferente do enter mas continua a introduzir 5 '_' em vez de 4 que o numero de letras da palavra

desde já agradeço a quem me poder ajudar se for preciso mais código eu posso enviar é só pedir.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mas o problema é que ele esta a contar o enter

teres o ENTER é em sí um problema que evitaria esse trabalho todo se resolvesses de imediato.

apresenta o código que está a guardar a frase na variável "frase"


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

Share this post


Link to post
Share on other sites
BlackSnow

a variável frase esta a vir de um ficheiro.

        for(a=1;a<=f;a++)
        {
fgets(frase,6,Ficheiro);       
        }
        fclose(Ficheiro); 

mas esta pode ser introduzida por uma função de sugestão ou já se encontra no ficheiro.

       fputs("\n",Ficheiro);       
       fputs(palavra,Ficheiro);

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

para resolver o teu problema, basta eliminar o ENTER final (caso este exista):

size_t strlength = strlen(frase);
if (frase[strlength - 1] == '\n')
 frase[strlength - 1] = '\0';

este é um processo normal a ser realizado quando se usa métodos de leitura de strings que guardam o ENTER lido do buffer de entrada na string dada como destino dos dados lidos.


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

Share this post


Link to post
Share on other sites
BlackSnow

onde devo então introduzir esse pedaço de código ? quando insiro uma novo frase para o ficheiro ou quando estou a ler a frase?

Share this post


Link to post
Share on other sites
BlackSnow

é como eu tentei não resultou :( poderias dar um exemplo com o código que enviei ?

desde já obrigado pela ajuda prestada.

Share this post


Link to post
Share on other sites
HappyHippyHippo

o código apresentado serve para alterar o caracter ENTER ('\n') pelo terminador de uma string ('\0'), logo é obvio que a sua utilização deverá ser imediatamente após a leitura do conteúdo do buffer de entrada


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

Share this post


Link to post
Share on other sites
BlackSnow

experimentei usar nos dois sítios e não resultou :/

acho que não estou a compreender bem o sitio correto para usar.

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que seria bom era apresentares o código que tens neste momento para que as outras pessoas não estejam a tentar adivinhar


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

Share this post


Link to post
Share on other sites
BlackSnow

esta é a função que permite adicionar mais palavras:

int sugestao()
{

 int nivel;
 FILE *Ficheiro;
 char MinhaString[100],resposta,palavra[10];
 char numero[10],Linha[200];
int x=0;

 system("CLS");  
 printf("\nAgora que seleciona o modo Sugestao, por favor indique que nível deseja sugerir palavras novas\n");	
 printf("Que nível deseja?(nível-1 palavras de 4 letras; nível-2 palavras de 6 letras; nível-3 palavras de 8 letras; nível-4 palavras de 10 letras)\n");
 scanf("%d", &nivel);

 switch(nivel)
 {
case 1:

 do
 {

 Ficheiro=fopen("Nível 1.txt","r");//abrir o ficheiro para leitura
   do
   {
	  fgets(MinhaString,100,Ficheiro);//lê uma string de cada vez		
	 x++;
 }while(!feof(Ficheiro));

   fclose(Ficheiro);//fechar o ficheiro
 printf("frase: %s x=%d\n\n",MinhaString,x);//mostrar a string que foi lida
   getchar();
 printf("digite a palavra:");
   scanf("%s",&palavra);

   printf("a palavra que sugirio foi: %s (nao te esquecas a palavra so pode ter 4 letras)\n",palavra);
   printf("a palavra esta correta ? (se S o programa vai prosseguir, se N vamos voltar a pedir uma nova palavra)\n");
   scanf("%s",&resposta);

   Ficheiro=fopen("Nível 1.txt","a");
   if(resposta=='S' || resposta=='s')
   {
	fputs("\n",Ficheiro);	  
	fputs(palavra,Ficheiro);
	x++;
   }

   fclose(Ficheiro);
  }while(resposta=='N' || resposta=='n');

   printf("Pressione o enter para sair");
   getchar();

Ficheiro=fopen("Numero de b.txt","r");
fgets(Linha,200,Ficheiro);
fclose(Ficheiro);

itoa(x,numero,10);

Ficheiro=fopen("Numero de b.txt","w");//abrir o ficheiro para escrita, caso o ficheiro não exista cria uma ficheiro novo
fputs(numero,Ficheiro);
fputs("\n",Ficheiro);
fclose(Ficheiro);//fechar o ficheiro  


	break;

.

.

.

vai ate ao case 4 tudo igual

//*****************************************************************************

esta é a função de jogar

else// single player
{


system("CLS");
printf("\nAgora que seleciona o modo jogo, por favor indique que nível deseja jogar\n");	
printf("Que nível deseja jogar?(nível-1 palavras de 4 letras; nível-2 palavras de 6 letras; nível-3 palavras de 8 letras; nível-4 palavras de 10 letras)\n");
scanf("%d", &nivel);
getchar();



switch(nivel)
{
case 1:

 Ficheiro=fopen("Numero de b.txt","r");//abrir o ficheiro para leitura
 fgets(MinhaString,100,Ficheiro);//lê uma string de cada vez		
 fclose(Ficheiro);//fechar o ficheiro

 novonumero=atoi(MinhaString);

f=novonumero;

f=random(1,f);

	 Ficheiro=fopen("Nível 1.txt","r");

	 for(a=1;a<=f;a++)
	 {
fgets(frase,6,Ficheiro);	
	 }
	 fclose(Ficheiro);

 char palavra[30], resultado[30], dica[50], letra;
 int numletras,i,k,achou,erro=0,correto=0;
 char alfa[] = {"abcdefghijklmnopqrstuvwxyz"};

system("cls");
numletras = strlen(frase);
system("cls");

/* Vetores */

for(i=0;i<numletras!='\0';i++)
{
if (letra == frase[i])
resultado[i] = frase[i];
resultado[i] = '_';
printf("%c ",resultado[i]);
}
resultado[i]='\0';
system("cls");
do
{
for (i=0; alfa[i] != '\0'; i++)
{
if (letra == alfa[i])
alfa[i] = '-';

putchar (alfa[i]);
printf(" ");
}

printf("\n\nInsira uma letra: \n");
printf("Nao precisa pressionar enter para validar a escolha. se o fizer pode contar como uma tentativa!!");
printf("\n\nVidas %d/6\n",erro);
switch(erro)
{
 case 0: printf("___________ \n|		 | \n|		_|_\n|		 \n|		 \n|		 \n| \n| \n| \n\n");
 break;

 case 1: printf("___________ \n|		 | \n|		_|_\n|		 O	\n|		 \n|	 \n| \n| \n| \n\n");
 break;

 case 2: printf("___________ \n|		 | \n|		_|_\n|		 O	\n|		 |	\n|		 \n| \n| \n| \n\n");
 break;

 case 3: printf("___________ \n|		 | \n|		_|_\n|		 O	\n|		/|	\n|		 \n| \n| \n| \n\n");
 break;

 case 4: printf("___________ \n|		 | \n|		_|_\n|		 O	\n|		/|\\	\n|		 \n| \n| \n| \n\n");
 break;

 case 5: printf("___________ \n|		 | \n|		_|_\n|		 O	\n|		/|\\	\n|		/ \n| \n| \n| \n\n");
 break;
}

for(i=0;i<numletras;i++)
printf("%c ",resultado[i],"\n");
printf("\n\n",letra=getche());
k=0;
achou = 0;
while(k<numletras)
{
if (letra == frase[k])
{

resultado[k] = letra;
achou = 1;
correto++;
}
k++;
}
if(achou==0)
erro++;
system("cls");
printf("\n");

}while((erro <6)&&(correto < numletras));

if(correto == numletras)
{
printf("\nParabens voce Ganhou!!! Pressione enter e volte ao menu inicial \n\n");

 printf("\n\n\n\t\t []	[] [][][] []	 [] [][][] []		[] [][][] []	 [] \n");
printf("\t\t []	[] []	[] [][]	[] []	 [][]	[][] []	[] [][]	[] \n");		
printf("\t\t []	[] []	[] [] [] [] []	 [] [] [] [] []	[] [] [] [] \n");
printf("\t\t [][][][] [][][][] [] [] [] [] [][] [] [][] [] [][][][] [] [] [] \n");
printf("\t\t []	[] []	[] [] [] [] []	[] [] [] [] []	[] [] [] [] \n");
printf("\t\t []	[] []	[] []	[][] [][][] []		[] []	[] []	[][] \n");
printf("\t\t												 _____________					 \n");		
printf("\t\t												 |		 |					 \n");
printf("\t\t												 |		 |					 \n");
printf("\t\t												 |								 \n");
printf("\t\t												 |								 \n");
printf("\t\t												 |								 \n");
printf("\t\t												 |								 \n");
printf("\t\t												 |							 /'''\\	\n");
printf("\t\t												 |							 | O O |	\n");
printf("\t\t												 |							 | \\_/ |	\n");
printf("\t\t												 |							 \\,,,/	\n");
printf("\t\t												 |								 |	 \n");
printf("\t\t												 |								/|%c	 \n",92);
printf("\t\t												 |							 / | %c	\n",92);		
printf("\t\t												 |_____________					|	 \n");
printf("\t\t												 |			|__				 %c %c	 \n",47,92);
printf("\t\t												 |			 |			 %c %c	\n",47,92);
printf("\t\t												 %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c				 \n",238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238);
textcolor(BRANCO);
}
else
{
printf("\nUps perdeu!!! tente de novo ao clicar enter e voltar ao menu inicial\n\n");

 printf("\n\n\n\t\t []	[] [][][] []	 [] [][][] []		[] [][][] []	 [] \n");
 printf("\t\t []	[] []	[] [][]	[] []	 [][]	[][] []	[] [][]	[] \n");		
 printf("\t\t []	[] []	[] [] [] [] []	 [] [] [] [] []	[] [] [] [] \n");
 printf("\t\t [][][][] [][][][] [] [] [] [] [][] [] [][] [] [][][][] [] [] [] \n");
 printf("\t\t []	[] []	[] [] [] [] []	[] [] [] [] []	[] [] [] [] \n");
 printf("\t\t []	[] []	[] []	[][] [][][] []		[] []	[] []	[][] \n");
 printf("\t\t												 _____________					 \n");		
 printf("\t\t												 |		 |					 \n");
 printf("\t\t												 |		 |					 \n");
 printf("\t\t												 |		 /'''\\				 \n");
 printf("\t\t												 |		| x x |				 \n");
 printf("\t\t												 |		| --- |				 \n");
 printf("\t\t												 |		 \\,,,/				 \n");
 printf("\t\t												 |		 |					 \n");
 printf("\t\t												 |		 /|%c					\n",92);
 printf("\t\t												 |		 / | %c				 \n",92);
printf("\t\t												 |		 |					 \n");
printf("\t\t												 |		 %c %c				 \n",47,92);
 printf("\t\t												 |		 %c %c				 \n",47,92);
printf("\t\t												 |								 \n");		
printf("\t\t												 |_____________					 \n");
printf("\t\t												 |			|__				 \n");
printf("\t\t												 |			 |				 \n");
printf("\t\t												 %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c				 \n",238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238);
textcolor(BRANCO);
//getch ();
}

	break;

também posso mandar um zip com tudo la dentro e testas o programa se preferires

Edited by BlackSnow

Share this post


Link to post
Share on other sites
HappyHippyHippo

queres saber dum uma coisa engraçada ?

em nenhuma parte desse código, tem o processo que descrevi para remoção do caracter '\n'

tem piada, não tem ?


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

Share this post


Link to post
Share on other sites
BlackSnow

eu mandei o código que não foi editado pois nos sítios que usei não resultou

os sítios onde introduzi o código que mandas te foram:

for(a=1;a<=f;a++)

{

fgets(frase,6,Ficheiro);

size_t strlength = strlen(frase);

if (frase[strlength - 1] == '\n')

frase[strlength - 1] = '\0';

}

fclose(Ficheiro);

e

Ficheiro=fopen("Nível 1.txt","a");

if(resposta=='S' || resposta=='s')

{

fputs("\n",Ficheiro);

fputs(palavra,Ficheiro);

size_t strlength = strlen(frase);

if (frase[strlength - 1] == '\n')

frase[strlength - 1] = '\0';

x++;

}

fclose(Ficheiro);

Share this post


Link to post
Share on other sites
HappyHippyHippo

tens a noção que a função fputs é para escrever uma string num stream, e como tal, tanto não faz sentido andares a remover um caracter de uma string que nem sequer está a ser utilizada nesse processo, certo ?


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

Share this post


Link to post
Share on other sites
BlackSnow

como já deu para perceber eu sou novo na programação e se estou a pedir ajuda é porque não sei como fazer ...

como disse nos sítios que usei não resultou logo suponho que não fosse ali.

já reparei que tens Skype posso te mandar o programa todo por Skype se o quiseres ver. agradecia era ajuda nesta parte pois é um parte importante do trabalho.

Share this post


Link to post
Share on other sites
HappyHippyHippo

por ter assumido que não sabias como resolver (seja por seres novo em programação ou não), é a razão pela qual te foi apresentada a solução completa (código)

no entanto, é suposto que a utilização do código fornecido seja feita de modo racional e inteligente.

olha o que te foi dito :

a ser realizado quando se usa métodos de leitura de strings que guardam o ENTER

foi dito claramente que o processo é para ser usado após a leitura de strings. processo esse que adiciona o caracter ENTER(\n') no final da string lida, caracter esse que te estava a dar problemas.

se o problema era:

usei o strlen para fazer isso.

Mas o problema é que ele esta a contar o enter também e não pretendo isso, já fiz isto :

será óbvio que o objectivo será remover o ENTER(\n') que estava a complicar o processo que pretendias implementar.


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

Share this post


Link to post
Share on other sites
HappyHippyHippo

se o teu erro era ao fazeres strlen de uma string com o ENTER no final, e agora que te foi dado o código para o remover, qual é afinal o erro ?


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

Share this post


Link to post
Share on other sites
BlackSnow

obrigado já esta a funcionar peço desculpa pelo incomodo e pela minha falta de atenção :/

tinha mais uma duvida se me podasse ajudar agradecia se não compreendo que já esteja farto de mim xD

o meu jogo esta a fazer uma coisa estranha: se a frase a adivinhar for "casa" aparece os 4 "_ _ _ _" Mas se eu clicar apenas 4x no "c" ou no "a" ou no "s" ganho, ou seja desde que a letra esteja na palavra e só pressionar essa letra ate ganhar :/

Edited by BlackSnow

Share this post


Link to post
Share on other sites
HappyHippyHippo

(sem olhar para o código)

- estás a contar o número de caracteres "acertados" em vez de o número de caracteres "descobertos"


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

Share this post


Link to post
Share on other sites
BlackSnow

ou seja o meu código tem isto:


printf("\n\nInsira uma letra: \n");
printf("Nao precisa pressionar enter para validar a escolha. se o fizer pode contar como uma tentativa!!");
printf("\n\nVidas %d/6\n",erro);
switch(erro)
{
case 0: printf("___________ \n| | \n| _|_\n| \n| \n| \n| \n| \n| \n\n");
break;

case 1: printf("___________ \n| | \n| _|_\n| O \n| \n| \n| \n| \n| \n\n");
break;

case 2: printf("___________ \n| | \n| _|_\n| O \n| | \n| \n| \n| \n| \n\n");
break;

case 3: printf("___________ \n| | \n| _|_\n| O \n| /| \n| \n| \n| \n| \n\n");
break;

case 4: printf("___________ \n| | \n| _|_\n| O \n| /|\\ \n| \n| \n| \n| \n\n");
break;

case 5: printf("___________ \n| | \n| _|_\n| O \n| /|\\ \n| / \n| \n| \n| \n\n");
break;
}

for(i=0;i<numletras;i++)
printf("%c ",resultado[i],"\n");
printf("\n\n",letra=getche());
k=0;
achou = 0;
while(k<numletras)
{
if (letra == frase[k])
{ 
resultado[k] = letra;
achou = 1;
correto++;
}
k++;
}
if(achou==0)
erro++;
system("cls");
printf("\n");

}while((erro <6)&&(correto < numletras));

Edited by BlackSnow

Share this post


Link to post
Share on other sites
BlackSnow

já substitui de varias maneiras o while e continua só consegui que parasse de ganhar caso premisse as letra iguais mas agora escrevo a palavra e não ganho

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.