Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

citadp

Leitura do teclado

Recommended Posts

citadp

OLá, estou a tentar fazer um programa que leia do teclado alguns comandos.

Mas quando ele chega à função stcmp para ver se foi aquele comando que o utilizador meteu, ele dá segmentation fault , já fiz print's antes e depois dessa linha , e as antes ele imprime, mas depois não.

 printf("Introduza a operacao pretendida:\n");
 char input[MAX_LINE];
 fgets(input,MAX_LINE, stdin);
 aux = strtok( input, " ");

 printf("tamos antes do copiar\n");

 if ( strcmp ( aux, "copiar\n" ) == 0 ) {
               printf("tamos depois do copiar\n");


Depois da linha if ( strcmp ( aux, "copiar\n" ) == 0 ){ ele já não imprime o printf e dá segmentation fault

Edited by pmg
Flata LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

Se eu interpreto bem o teu programa, principalmente a razão do strtok() -- o utilizador escreve qualquer coisa como "copiar ficheiro pasta<ENTER>"; e não "copiar<ENTER>" -- a condição no if não é verdade.

O teu programa não imprime o "tamos depois do copiar\n" porque não passa nessa parte do código.

Qual é o efeito que pretendes com o strtok()?

Qual é o resto do código?


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
pmg

Alem disso, definiste aux como char.

Depois atribuis-lhe o valor devolvido pela função strtok() que é de tipo char*.

Com os warnings do compilador ligados, ele avisava-te que não podes fazer isto!

Mais tarde passas aux como argumento à função strcmp(). Mais uma vez, não podes passar um char em vez dum char*.

Liga os warnings do teu compilador e não corras o programa antes de limpares todos os warnings


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
citadp

Pois, se calhar não tenho warning's ligados, porque não me aparece nada.!!

Vou experimentar!

Share this post


Link to post
Share on other sites
citadp

Ao meter o apontador char *aux;

Ele dá warning! Por isso é que sem o apontador ele fazia, mas dava segmentation!

int status;
int sair=0;
pid_t a;
char *funcao;

while(sair!=1) {

 printf("Introduza a operacao pretendida:\n");
 char input[MAX_LINE];
 fgets(input,MAX_LINE, stdin);
 funcao = strtok ( input, " " );

 printf("tamos antes do copiar\n");



 */


 /* ************copiar****************** */

 if ( strcmp ( &funcao, "copiar\n" ) == 0 ) {
 printf("entramos no copiar\n");
  a = fork();
  if(a == -1){
  perror("Erro ao criar filho ");
  exit(1);
  }
  (...)

agr apresenta este erro: so.c:37:10: warning: assignment makes pointer from integer without a cast [enabled by default]

em que a linha 37 é funcao = strtok ( input, " " );

Edited by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

apresenta este erro: so.c:37:10: warning: assignment makes pointer from integer without a cast [enabled by default]

Experimenta incluir o header que tem a declaração da função strtok()

#include <string.h>


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
pmg

Consegui! Muito obrigada! Não me tava mesmo a ocorrer as bibliotecas :D

Hmmm ... deixa-me explicar:

O warning "assignment makes pointer from integer without a cast" na linha

funcao = strtok ( input, " " );

quando tanto funcao como input são do tipo correcto só quer dizer que o warning vem de outro objecto presente nessa linha. Qual objecto? Tirando o literal " " não está lá mais nada.

Ah! Mas está. Está lá o valor devolvido pela função.

Pois, mas esse valor é, obviamente, do tipo correcto.

O problema é que o compilador não sabe qual é esse tipo: ninguém lhe disse. Então o compilador assume que a função devolve um int. Ao tentar atribui esse valor (de tipo int) à variável função (de tipo char*) dá o warning.


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

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

×

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.