Página 1 de 2 12 ÚltimoÚltimo
+ Responder ao Tópico



  1. #1
    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
    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
    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
    esse barado de fflush(stdin) naum funfa comigo naum...



  5. 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.






Tópicos Similares

  1. Duvida sobre uma coisa do underlinux...........
    Por _Luigi_ no fórum UnderLinux
    Respostas: 7
    Último Post: 07-12-2002, 22:51
  2. Duvidas sobre o squid
    Por no fórum Servidores de Rede
    Respostas: 0
    Último Post: 27-11-2002, 11:11
  3. Duvidas sobre Log access.log do SQUID !!!
    Por Danielvb no fórum Servidores de Rede
    Respostas: 2
    Último Post: 23-11-2002, 15:46
  4. duvida sobre o syslog
    Por augustolynx no fórum Servidores de Rede
    Respostas: 1
    Último Post: 29-10-2002, 07:50
  5. DUVIDA, SOBRE DYNAMIC DNS NO APACHE ???
    Por _Luigi_ no fórum Servidores de Rede
    Respostas: 4
    Último Post: 13-10-2002, 08:07

Visite: BR-Linux ·  VivaOLinux ·  Dicas-L