Programando em C - Código dando Erro

    Autor Mensagem
    kohler1000
    Veterano
    # abr/11


    http://pastebin.com/yFg0DyUY

    Olá, nerds... estou tendo dificuldades em fazer meu programa ler um nome de n palavras e colocar num mesmo string! O código está bem comentado, qualquer dúvida em relação a ele, podem perguntar aqui que eu respondo...

    O programa compila, mas não faz o que eu quero! Na hora de rodar ele trava quando chega na parte da função lenome agir...

    Muito obrigado pela ajuda.

    marcosshrp
    Veterano
    # abr/11
    · votar


    Não manjo disso, só postei pra ser o primeiro..

    rodsom
    Veterano
    # abr/11
    · votar


    inda bem que eu sou mecanico

    Kobberminer
    Veterano
    # abr/11
    · votar


    //trecho estabelece o tanto de memória dinâmica que os strings terão:
    caractere=(char*)malloc(100*sizeof(char));
    vetornome=(char*)malloc(100*sizeof(char));
    pivo=(char*)malloc(100*sizeof(char));

    FILE *entrada=fopen("entrada.txt", "r"); //estabelece um fluxo somente leitura com o arquivo de entrada
    FILE *saida=fopen("saída.txt","w+"); //estabelece um fluxo de leitura e escrita/cria o arquivo de saída

    //trecho atribui e escreve o número da rodada:
    fscanf(entrada, "%s",caractere);
    nrod=atoi(caractere);
    printf("%d", nrod);


    uAHUahUHhauUAhuaHAHUaUAUUhauuHAUhauUuahUHAuhauHAUhauHAUhauHAUhauhaUHAU hauHU

    Que absurdo é esse? Tá locão? rsrsrsrs

    -Toolbar-
    Veterano
    # abr/11
    · votar


    Programação é uma bosta, na moral. Ano que vem vc esquece tudo. Te digo!

    Morgenstern
    Veterano
    # abr/11
    · votar


    Programando em C

    Boa sorte ...

    [M]@a.[K]!ller
    Veterano
    # abr/11
    · votar


    -Toolbar-
    Realmente. O foda é que um errinho simples num programa gigante pode fazer o programa nem iniciar.

    james_the_bronson
    Veterano
    # abr/11
    · votar


    Logo em C, que se for maior não tem acidentes :O !!!

    marcus c. f.
    Veterano
    # abr/11
    · votar


    Tá confuso esse código, hein?
    Que tal reescrever seguindo estas dicas?

    Pra testar se um caracter é dígito, basta:

    int ch = fgetc(entrada);
    if(ch >= '0' && ch <= '9') { É dígito! }

    ou
    #include <ctype.h>
    int ch = fgetc(entrada);
    if(isdigit(ch)) { É dígito! }


    Para ler um nome até um dígito (sem incluir o dígito), com no máximo 99 caracteres (pega espaços normalmente), use algo como:

    fscanf(entrada, "%99[^0-9]", vetornome);


    Esta linha não faz sentido. Ela soma dois chars. Quanto é 'G' + 'i'?
    *vetornome = *vetornome+*pivo;

    Além disso, o conteúdo de vetornome não está inicializado (ele está alocado, mas dentro desse espaço alocado nada foi posto, nem um '\0' pra marcar como string vazia).

    Talvez tu quisesse usar um strcat? Mas se usar o fscanf do jeito que eu indiquei, não vai precisar do strcat.

    O nome da sua função "lenome" não está nada apropriado. Ela poderia se chamar "isdigit" (mas esse nome já é usado pela função do C, escolha outro), se eu entendi o que ela está fazendo. Ah, ela não está considerando '9' como dígito.

    Não precisa colocar o 48 no seu código e comentar seu significado. Um simples '0' faz a mesma coisa e dispensa o comentário.

    Como eu disse no começo, reescreve seguindo essas dicas. Se ainda assim não funcionar, poste o seu novo código pra vermos o que está acontecendo.

    kohler1000
    Veterano
    # abr/11
    · votar


    Kobberminer

    //trecho estabelece o tanto de memória dinâmica que os strings terão:
    caractere=(char*)malloc(100*sizeof(char));
    vetornome=(char*)malloc(100*sizeof(char));
    pivo=(char*)malloc(100*sizeof(char));

    FILE *entrada=fopen("entrada.txt", "r"); //estabelece um fluxo somente leitura com o arquivo de entrada
    FILE *saida=fopen("saída.txt","w+"); //estabelece um fluxo de leitura e escrita/cria o arquivo de saída

    //trecho atribui e escreve o número da rodada:
    fscanf(entrada, "%s",caractere);
    nrod=atoi(caractere);
    printf("%d", nrod);


    uAHUahUHhauUAhuaHAHUaUAUUhauuHAUhauUuahUHAuhauHAUhauHAUhauHAUhauhaUHAU hauHU

    Que absurdo é esse? Tá locão? rsrsrsrs



    Locão por que? Posso saber? Esse trecho está totalmente correto.

    kohler1000
    Veterano
    # abr/11
    · votar


    marcus c. f.

    Você se importa me passar seu MSN pra me ajudar nisso?
    Acho mais fácil do que ficar falando aqui pelo fórum!

    marcus c. f.
    Veterano
    # abr/11
    · votar


    Você se importa me passar seu MSN pra me ajudar nisso?

    Me importo.

    Igão
    Veterano
    # abr/11 · Editado por: Igão
    · votar


    kohler1000
    Você se importa me passar seu MSN pra me ajudar nisso?
    Acho mais fácil do que ficar falando aqui pelo fórum!

    marcus c. f.
    Me importo.


    Bem...


    On Topic:

    Eu nem sei do que estamos falando!!1 riariariariaria!!

    qew
    Veterano
    # abr/11
    · votar


    kohler1000
    Você se importa me passar seu MSN pra me ajudar nisso?
    Acho mais fácil do que ficar falando aqui pelo fórum!

    marcus c. f.
    Me importo.


    HAEUHUHAEUHEAUHEAUHEAUHEAUHEAUHE

    Sobre programar em C, só sei Programar em Fu simol mesmo. º.º

    /emoticondoPanucci

    kohler1000
    Veterano
    # abr/11
    · votar


    rs...

    Kobberminer
    Veterano
    # abr/11
    · votar


    kohler1000

    Eu sei*, tô te enchendo... não me denuncie, pls :)

    *na verdade eu não sei...

    kohler1000
    Veterano
    # abr/11
    · votar


    marcus c. f.

    Certo, então...
    Se eu fizer do jeito que você falou, o "cursor do arquivo" vai andar e ele não vai ler a primeira letra da palavra.

    Por exemplo, se tiver escrito "Pedro Henrique" ele vai ler "Pedro enrique"...

    Esse *vetor = *vetor + *caractere é uma tentiva de somar um string a um string ao invés dele deletar o que tava escrito e escrever algo novo! O que eu quero fazer é se num vetor estiver escrito "Pedro" e no outro " Henrique" fique "Pedro Henrique" ao invés de ficar só " Henrique", entende?

    Shredder_De_Cavaquinho
    Veterano
    # abr/11
    · votar


    Aii que burro, nem sabe programar em C...













    /nemeu

    marcus c. f.
    Veterano
    # abr/11
    · votar


    kohler1000
    Certo, então...
    Se eu fizer do jeito que você falou, o "cursor do arquivo" vai andar e ele não vai ler a primeira letra da palavra.

    Por exemplo, se tiver escrito "Pedro Henrique" ele vai ler "Pedro enrique"...


    Se você fizer fscanf(entrada, "%99[^0-9]", vetornome); ele vai ler "Pedro Henrique" direitinho, incluindo espaços antes, depois e no meio do nome, só parando num dígito. O"%[^0-9]" quer dizer "leia tudo até um dígito de 0 a 9). Você testou?

    E mesmo que pulasse uma letra, não é nada que um fseek(entrada,-1,SEEK_CUR); ou ungetc(ch, entrada); não resolva. Inclusive você já está fazendo isso em outra parte do programa.

    Esse *vetor = *vetor + *caractere é uma tentiva de somar um string a um string ao invés dele deletar o que tava escrito e escrever algo novo! O que eu quero fazer é se num vetor estiver escrito "Pedro" e no outro " Henrique" fique "Pedro Henrique" ao invés de ficar só " Henrique", entende?

    O jeito certo é com strcat. Concatenar strings com + é em C++, Java, Javascript, C#, etc., não em C. Mas usando o scanf como eu disse antes, ele vai ler todo o nome de uma vez sem precisar do strcat. No máximo tu vai precisar eliminar os espaços que podem ficar no começo e no fim da string.

    Além disso, o uso dos asteriscos está errado. Se vetor é um vetor como o nome diz, *vetor é uma única letra. Usando os asteriscos, você está operando com as letras em vez de operar com os vetores.

    kohler1000
    Veterano
    # abr/11
    · votar


    marcus c. f.

    Se você fizer fscanf(entrada, "%99[^0-9]", vetornome); ele vai ler "Pedro Henrique" direitinho, incluindo espaços antes, depois e no meio do nome, só parando num dígito. O"%[^0-9]" quer dizer "leia tudo até um dígito de 0 a 9).


    Deu certo! Mas engraçado isso ai.. não precisa nem falar que é char/vetor? tipo %s ou %c? Como que funciona esse recurso que você usou?


    Além disso, o uso dos asteriscos está errado. Se vetor é um vetor como o nome diz, *vetor é uma única letra. Usando os asteriscos, você está operando com as letras em vez de operar com os vetores.


    Entendi... valeu, cara...

    marcus c. f.
    Veterano
    # abr/11
    · votar


    O %[] funciona igual a um %s (ambos esperam um char*) só que dá pra escolher quais chars ele vai aceitar %[abc] ou não aceitar %[^abc]. No caso do %s ele sempre pára num espaço ou quebra de linha.

      Enviar sua resposta para este assunto
              Tablatura   
      Responder tópico na versão original
       

      Tópicos relacionados a Programando em C - Código dando Erro