Ir para o conteúdo
QuickFire

[Resolvido] Segmentation Fault

Mensagens Recomendadas

QuickFire    0
QuickFire

Boas :) tou aqui desesperado com isto :| peguei estas férias de novo no livro do Damas e na parte das strings ele diz uma função para comparar, eu escrevo a função mas quando vou a executar no windows, dá-me um erro de memória chato :shocking: a dizer mal do windows como nunca disse na vida fui até ao Ubuntu e meti-me a programar lá mas... puff dá erro na mesma mas agora já sei o que se trata :D este é o output:

EXECUTING:
/home/pedro/C/prog0706
----------------------------------------------
Nome: Pedro

----------------------------------------------
Program has been terminated receiving signal 11 (Segmentation fault)
Press the Enter key to close this terminal ...

O código é este:

#include <stdio.h>
#include <stdlib.h>

int strcmp(char *s1, char *s2) {
    int i;
    while (s1[i]==s2[i] && s1[i]!='\0') { i++; }
    return ((unsigned char) s1[i] - (unsigned char) s2[i]);
    }

main() {
       char nome[21];
       printf("Nome: "); scanf("%s", nome);
       printf("\n%d", strcmp(nome,"teste"));
       system("PAUSE");
}

Alguém sabe o que pode tar a acontecer ? Thanks :D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

Boas :) tou aqui desesperado com isto :| peguei estas férias de novo no livro do Damas e na parte das strings ele diz uma função para comparar, eu escrevo a função mas quando vou a executar no windows, dá-me um erro de memória chato :shocking: a dizer mal do windows como nunca disse na vida fui até ao Ubuntu e meti-me a programar lá mas... puff dá erro na mesma mas agora já sei o que se trata :D este é o output:

EXECUTING:
/home/pedro/C/prog0706
----------------------------------------------
Nome: Pedro

----------------------------------------------
Program has been terminated receiving signal 11 (Segmentation fault)
Press the Enter key to close this terminal ...

O código é este:

#include <stdio.h>
#include <stdlib.h>

int strcmp(char *s1, char *s2) {
    int i;
    while (s1[i]==s2[i] && s1[i]!='\0') { i++; }
    return ((unsigned char) s1[i] - (unsigned char) s2[i]);
    }

main() {
       char nome[21];
       printf("Nome: "); scanf("%s", nome);
       printf("\n%d", strcmp(nome,"teste"));
       system("PAUSE");
}

Alguém sabe o que pode tar a acontecer ? Thanks :D

a tua funcao nao esta a devolver um inteiro...  return ((unsigned char) s1 - (unsigned char) s2);

tv seja ai o erro..nao ??

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ricardo    0
Ricardo

Boas

Deves precisar de inserir um '\0' na string nome.

Em C todas as strings têm de acabar com o caracter '\0', senão começas a tentar aceder a posições de memória que não são tuas e aí aparece o tradicional "seg fault"  :D

Abraços!!  :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jarsantos    0
jarsantos

erro primário, nao estas a iniciar a variavel i a zero.

segmentation fault quer dizer que tentaste aceder a uma posiçao de memoria invalida.

o que se passa é que o compilador dá um numero arbitrario à variavel i, quando fazes nome o normal é que i seja muito maior que o tamanho da tua string e como tal acede a uma posiçao de memoria que nao esta reservada e dá o erro.

@tufas: o compilador retorna o codigo ascii do char que ele retorna.

@Gurzi: Li o Damas em 2 dias.

@vbmaster: em c é igual, mas como ele nao adicionou o string.h teve que criar a funçao...ajuda a treinar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jarsantos    0
jarsantos

Obvio que nao fiz os exercicios, mas serve para apanhar as bases e depois ir praticando e saber onde procurar no livro as duvidas que surgirem.

Partilhar esta mensagem


Link 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