Jump to content
Inacabado

Problema em leitura de caracteres para array de caracteres

Recommended Posts

Inacabado

Muito boa tarde ao forum. Estou a tentar resolver este problema que faz parte de um exercício de um livro que estou a ler "C primer plus" de Stephen Prata e não estou a conseguir.

A questão é o programa não dá erro mas também não sai do ciclo for apesar de eu entrar com 1 ou mais newlines.

Não estou mesmo a entender qual e o problema e porque isso acontece.

Eis o código:

/*  */
#include <stdio.h>
int main(void)
{
        const int MAX=255;
        int i;
        char line[MAX];
        printf("Please enter a line of text:\n");
        for(i=0;scanf(" %c",&line[i])!='\n';i++)
                
        line[i]='\0';           
        printf("Saimos do ciclo while.\nvalores no array:\n");
        for(i=0;i!='\0';i++)
                printf("%c",line[i]);
        printf("Bye!!!\n");
        
return 0;
}

Agradeceria imenso uma indicação de como desbloquear este problema.

Muito obrigado de antemao.

Share this post


Link to post
Share on other sites
Inacabado
46 minutos atrás, HappyHippyHippo disse:

dica : ;

chegas lá ?

A primeira vista nao chego la! Mas de-me mais algum tempo e ja lhe dou uma resposta definitiva.

Share this post


Link to post
Share on other sites
Inacabado

Nao vou la! Isto e frustrante... Nao so acabei de ler todos o capitulo previos a este exercício como ja ando neste problema a 2 dias, e nao sai nada. Agora o ";" nao responde muito a minha duvida pois o compilador nao acusou falta de nenhum... Nao estou a conseguir...

Share this post


Link to post
Share on other sites
HappyHippyHippo
9 minutes ago, Inacabado said:

Nao vou la! Isto e frustrante... Nao so acabei de ler todos o capitulo previos a este exercício como ja ando neste problema a 2 dias, e nao sai nada. Agora o ";" nao responde muito a minha duvida pois o compilador nao acusou falta de nenhum... Nao estou a conseguir...

realmente não tens erros de sintaxe, agora de semantica ... ui !!!

ora vamos lá ver o que fazem estas duas linhas :

  9         for(i=0;scanf(" %c",&line[i])!='\n';i++)
 10                 
 11         line[i]='\0'; 

 


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

Share this post


Link to post
Share on other sites
Inacabado

Ja previa que se fosse perguntar pela linha no. 11, mas devo esclarecer que este e um programa que tenho em teste, para fazer parte de um programa maior que no caso e inverter uma string. por isso o

line[i]='\0';

esta um pouco fora de contexto, pois fui testar esta porção do código noutro ficheiro.c.

A semântica e um pouco como os gostos, cada um tem o seu, e eu como gosto de "elegancias" tenho a tendência para parecer um pouco críptico para quem le o meu código. Gostos...

Respondendo a tua pergunta

16 minutos atrás, HappyHippyHippo disse:

ora vamos lá ver o que fazem estas duas linhas :


  9         for(i=0;scanf(" %c",&line[i])!='\n';i++)
 10                 
 11         line[i]='\0'; 

 

Acho que e auto-explanatório: insere um caracter no array line, ate encontrar uma new line \n!

Mas devo dizer que ja testei de outra forma com o while assim:

 10         while(scanf("%c",&line[i])!='\0')
 11         {
 12                 i++;
 13         }

 

Edited by Inacabado

Share this post


Link to post
Share on other sites
Inacabado

Acabei de testar desta maneira:

  6         const int MAX=255;
  7         int i=0;
  8         char ch, line[MAX];
  9         printf("Please enter a line of text:\n");
 10         while(scanf("%c",&ch)!='\n')
 11         {
 12                 line[i]=ch;
 13                 i++; 
 14         }

E continua a nao me sair do ciclo... Mas devo dizer que ja testei de muitas outras maneiras, tem sido 2 dias (pos-laboral) que nao me sai nada!

Edited by Inacabado

Share this post


Link to post
Share on other sites
HappyHippyHippo
10 hours ago, Inacabado said:

Ja previa que se fosse perguntar pela linha no. 11, mas devo esclarecer que este e um programa que tenho em teste, para fazer parte de um programa maior que no caso e inverter uma string. por isso o


line[i]='\0';

esta um pouco fora de contexto, pois fui testar esta porção do código noutro ficheiro.c.

para o código actual, é irrelevante o que vais futuramente fazer com ele. o que me interessa é o que é apresentado e mais nada

10 hours ago, Inacabado said:

A semântica e um pouco como os gostos, cada um tem o seu, e eu como gosto de "elegancias" tenho a tendência para parecer um pouco críptico para quem le o meu código. Gostos...

Em programação, a semântica é o que o programa faz, logo, se o programa não faz o que devia, então tem problemas de semântica. Não interessa como o faz, mas terá de fazer o pretendido.

10 hours ago, Inacabado said:

Respondendo a tua pergunta

Acho que e auto-explanatório: insere um caracter no array line, ate encontrar uma new line \n!

também eu queria que fizesse isso, mas não faz, e a razão está na dica que te dei. Vou-te dar uma ajuda de uma maneira diferente. Vou alterar o código tendo duas coisas em conta:

- vou inicializar a memória da variável line a zeros de forma a não ser necessário a linha 11

- ao não ser necessário a linha 11, vou remover-la:

#include <stdio.h>
int main(void)
{
  const int MAX=255;
  int i;
  char line[MAX] = {0};
  printf("Please enter a line of text:\n");
  for(i=0;scanf(" %c",&line[i])!='\n';i++)

  printf("Saimos do ciclo while.\nvalores no array:\n");
  for(i=0;i!='\0';i++)
    printf("%c",line[i]);
  printf("Bye!!!\n");

  return 0;
}

agora corre isso e diz o que aparece


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

Share this post


Link to post
Share on other sites
Inacabado
3 horas atrás, HappyHippyHippo disse:

para o código actual, é irrelevante o que vais futuramente fazer com ele. o que me interessa é o que é apresentado e mais nada

Em programação, a semântica é o que o programa faz, logo, se o programa não faz o que devia, então tem problemas de semântica. Não interessa como o faz, mas terá de fazer o pretendido.

também eu queria que fizesse isso, mas não faz, e a razão está na dica que te dei. Vou-te dar uma ajuda de uma maneira diferente. Vou alterar o código tendo duas coisas em conta:

- vou inicializar a memória da variável line a zeros de forma a não ser necessário a linha 11

- ao não ser necessário a linha 11, vou remover-la:


#include <stdio.h>
int main(void)
{
  const int MAX=255;
  int i;
  char line[MAX] = {0};
  printf("Please enter a line of text:\n");
  for(i=0;scanf(" %c",&line[i])!='\n';i++)

  printf("Saimos do ciclo while.\nvalores no array:\n");
  for(i=0;i!='\0';i++)
    printf("%c",line[i]);
  printf("Bye!!!\n");

  return 0;
}

agora corre isso e diz o que aparece

Diz que a variável nao pode ser inicializada! Lembrei-me que haveria qualquer problema ao inicializar variaveis se usasse-mos uma variavel const. Mudei para o define assim:

#define MAX 255

e logo que carrego no enter tem um comportamento inusual, pois repete o printf seguinte tantas vezes quantas as letras que insira no scanf do ciclo for que estamos a debater.

Share this post


Link to post
Share on other sites
HappyHippyHippo

e, lendo o código, que ciclo é esse ?

(nota que as perguntas que são feitas são dicas sobre o problema)


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

Share this post


Link to post
Share on other sites
Inacabado
3 horas atrás, HappyHippyHippo disse:

e, lendo o código, que ciclo é esse ?

Nao saiu ainda do ciclo for! Mas o ; no final ou a seguir ao ciclo for tambem nao me resolve o problema pois já testei.

Nao terá algo a ver com o buffer do teclado? Se calhar estou a tentar fazer tudo ao mesmo tempo!

3 horas atrás, HappyHippyHippo disse:

(nota que as perguntas que são feitas são dicas sobre o problema)

Eu compreendo isso, isto nao e um chat . Gostava era de perceber a lógica por detrás da falha, afim de nunca mais errar neste tipo de problemas e compreender os mecanismos, e sei bem que as perguntas que me fazes me podem conduzir a essa compreensão.

 

Se calhar com getchar() resolvia o problema, mas no capitulo onde estou ainda nao foi apresentada essa funcao/macro por isso estou a resolver os exercicios so com a materia referente ao mesmo capitulo, e descuro outras maneiras de resolver o problema. Se calhar e uma pergunta no capitulo errado! Ja agora a pergunta e esta:

"Write a program that reads in a line of input and then prints the line in reverse order.
You can store the input in an array of char ; assume that the line is no longer than 255
characters. Recall that you can use scanf() with the %c specifier to read a character at
a time from input and that the newline character ( \n ) is generated when you press the
Enter key."

 

Presumo portanto que com as armas que tenho possa enfrentar o problema...

Edited by Inacabado

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... estou a ver que o primeiro problema já te apercebeste, logo podemos seguir.

sim, o problema inicial é na realidade a falta do ; no primeiro ciclo.

agora ... existem vários outros problemas:

- ao usares o formato de leitura " %c", o espaço executa o descartar de todos os caracteres considerados como espaço, logo o caracter '\n' nunca será lido.

- o retorno da função scanf não é o caracter lido, mas sim o número de elementos lidos em termos do formato dado, logo nunca pode ser usado como comparador com o caracter de fim de linha

- o segundo ciclo for, volta a ter problemas na condição de paragem

  • Vote 1

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

Share this post


Link to post
Share on other sites
Inacabado
1 hora atrás, HappyHippyHippo disse:

- ao usares o formato de leitura " %c", o espaço executa o descartar de todos os caracteres considerados como espaço, logo o caracter '\n' nunca será lido.

Tem logica, tem! O meu pensamento foi colocar o espaco para descartar o '\n' do printf anterior, por isso o " %c".

 

1 hora atrás, HappyHippyHippo disse:

- o retorno da função scanf não é o caracter lido, mas sim o número de elementos lidos em termos do formato dado, logo nunca pode ser usado como comparador com o caracter de fim de linha

Completamente de acordo e eu ate sabia isso, mas ignorei! O retorno do scanf ou e 0 ou 1 neste caso especifico.

1 hora atrás, HappyHippyHippo disse:

- o segundo ciclo for, volta a ter problemas na condição de paragem

Talvez porque ainda nao acrescentei o caracter terminador '\0' ao ultimo elemento do vector.

Assim que possa vou alterar o codigo todo e torno a postar.

Muito, muito obrigado pelo tempo e pela paciencia. Estou reconhecido da ajuda recebida, obrigado...

 

p.s. Agora compreendo a questao da semantica do meu programa, estar completamente errada!

Edited by Inacabado
esclarecer

Share this post


Link to post
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.