+ Responder ao Tópico



  1. #1
    Visitante

    Padrão Duvidas sobre C

    olá a todos, bom eu tenho algumas duvidas, podem parecer, ou até ser mto bestas, , mais eu resolvi postar mesmo assim...

    seguinte, observem a seguinte declaração:

    char nome[10];
    scanf("%s", nome);

    1º - Na var nome cabem 10 caracteres, se eu digitar um nome com 20 caracteres,
    a var nome vai se redimensionar???eu fiz o seguinte programa:

    #include <stdio.h>

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    scanf("%s", nome);
    printf("Você digitou: %s", nome);
    }


    se eu digito um nome com 20 caracteres, ele eh exibido normalmente depois pela função printf, outra coisa, se oq eu digitar espaco, a função scanf naum pega o valor, ex:

    Digite o nome:
    Matheus Ricci
    Você digitou: Matheus

    isso seria resolvido com a função gets(), ficaria assim:

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    gets(nome);
    printf("Você digitou: %s", nome);
    }

    Funciona perfeitamente, mais se eu digitar mais de 10 palavras, eu recebo um Segmentation Fail, pois eu sobrecarreguei a variavel nome, estou certo???, outra coisa, na hora de compilar eu recebo um warning dizendo que a função gets é perigosa e não devia ser usada, e muitas vezes a execução pula um gets, isso não ocorre neste programa, mais se ocorrece, a solução seria:

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    gets(nome); /* gets pulada */
    gets(nome); /* gets valida */
    printf("Você digitou: %s", nome);
    }

    ouvi dizer que isso é buffer, essa afirmação está correta???

    bom resumindo tudo, gostaria de saber se existe uma função de entrada de dados que tivesse ou fosse parecida com a sintexe:

    funcao(tipo_da_variavel, variavel_de_destino, limite_de_caracteres);

    ou até mesmo

    get*(var_destino, limite_de_caracteres)

    alguem da um help

  2. #2
    veiga
    Visitante

    Padrão Re: Duvidas sobre C

    Olá,

    Citação Postado originalmente por Anonymous
    olá a todos, bom eu tenho algumas duvidas, podem parecer, ou até ser mto bestas, , mais eu resolvi postar mesmo assim...

    seguinte, observem a seguinte declaração:

    char nome[10];
    scanf("%s", nome);

    1º - Na var nome cabem 10 caracteres, se eu digitar um nome com 20 caracteres,
    a var nome vai se redimensionar???eu fiz o seguinte programa:
    Não, o nome não vai se redimensionar! o scanf() não faz isso, ele apenas pega a entrada formatada e coloca nas variáveis!

    Citação Postado originalmente por Anonymous
    #include <stdio.h>

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    scanf("%s", nome);
    printf("Você digitou: %s", nome);
    }


    se eu digito um nome com 20 caracteres, ele eh exibido normalmente depois pela função printf,
    a funcao scanf() colocou os 20 caracteres a partir da posicao nome, e colocou um '\0' no final... e a funcao printf() apenas imprimiu os caracteres até chegar no '\0'!

    faça um teste: em vez de 20 caracteres coloque 50, 100, 500... uma hora vai dar segmentation fault tbm!

    Citação Postado originalmente por Anonymous
    outra coisa, se oq eu digitar espaco, a função scanf naum pega o valor, ex:

    Digite o nome:
    Matheus Ricci
    Você digitou: Matheus
    pze, o scanf() le uma entrada formatada, dai ele pensa que o espaço em branco faz parte do formato, o mesmo acontece se tu colocar um tab ou der um enter!

    para receber esse espaco vc teria que colocar ele no formato, por exemplo:
    scanf("%s %s", nome, sobrenome);

    Citação Postado originalmente por Anonymous
    isso seria resolvido com a função gets(), ficaria assim:

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    gets(nome);
    printf("Você digitou: %s", nome);
    }

    Funciona perfeitamente, mais se eu digitar mais de 10 palavras, eu recebo um Segmentation Fail, pois eu sobrecarreguei a variavel nome, estou certo???, outra coisa, na hora de compilar eu recebo um warning dizendo que a função gets é perigosa e não devia ser usada,
    tem razão, não se deve utilizar gets()! gets() geralmente é um problema, porque coloca tudo o vem da entrada no buffer!

    funções que não checam o tamanho do buffer permitem ataque por buffer overflow.... e isso eh foda!

    Citação Postado originalmente por Anonymous
    e muitas vezes a execução pula um gets, isso não ocorre neste programa, mais se ocorrece, a solução seria:

    int main(){
    char nome[10];
    int i;
    printf("\nDigite o nome: \n");
    gets(nome); /* gets pulada */
    gets(nome); /* gets valida */
    printf("Você digitou: %s", nome);
    }

    ouvi dizer que isso é buffer, essa afirmação está correta???
    as vezes pula um gets() porque ele pegou o '\n' da ultima entrada! mas não eh o caso desse programa ai em cima!

    Citação Postado originalmente por Anonymous
    bom resumindo tudo, gostaria de saber se existe uma função de entrada de dados que tivesse ou fosse parecida com a sintexe:

    funcao(tipo_da_variavel, variavel_de_destino, limite_de_caracteres);

    ou até mesmo

    get*(var_destino, limite_de_caracteres)

    alguem da um help
    bom, uma alternativa segura para o gets() eh o fgets(), por exemplo:

    int main();
    {
    char buffer[128];

    printf("Nome: ");
    fgets(buffer,127,stdin);
    printf("Voce digitou: %s\n",buffer);

    return 0;
    }

    espero ter ajudado! qq coisa eh soh postar ae!




    Marcelo Veiga Neves
    http://www.inf.ufsm.br/~veiga

  3. #3
    Visitante

    Padrão Duvidas sobre C

    se tu quiser corrigir o problema de o gets pegar o "barra n"(meu teclado ta dando pau)...

    faz assim:

    antes do gets() usa fflush(stdin); tipo:

    fflush(stdin);
    gets();

  4. #4
    Autor do tópico
    Visitante

    Padrão Duvidas sobre C

    esse barado de fflush(stdin) naum funfa comigo naum...

  5. #5

    Padrão fgets

    tem a fgets();

    o protótipo eh o seguinte:

    char *fgets(char *s,int size,FILE *stream);

    pode usar assim:

    fgets(cadeia,20,stdin);

    dai ele vai colocar em "cadeia" o conteudo da entrada padrão(stdin), os primeiros 20 caracteres.

  6. #6

    Padrão pegar espaços com scanf();

    a gets() é perigosa pelo fato de que ela não tem prevenção alguma pro caso de o usuário digitar mais caracteres que o tamanho da cadeia onde serão armazenados estes. Tipo, se tu tem um vetor de 20 caracteres e o usuário digitar 27, vai dar "Segmentation Fault"... Com o fgets() você pode se previnir desse problema.

    tem tbm um formato bem estranho do scanf que pega os espaços junto:

    scanf("%[^\n]s",cadeia);

    isso significa que ela vai pegando os caracteres teh surgir um "\n"...

    mas tem akele velho problema da toamanho da cadeia... A scanf() não eh uma função muito segura...

    usa a fgets que é melhor.

    feito.