Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

citadp

Leitura do teclado

Mensagens Recomendadas

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

Editado por pmg
Flata LP no GeSHi

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


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

Partilhar esta mensagem


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

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.