Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Juin

STRNCPY

Recommended Posts

Juin

        switch (op){
            case 1:  
                printf("Nao Urgente selecionado.\n");
                      strncpy(dados.urgencia,"Nao Urgente",NCHAR);
                      break;
            case 2: printf("Urgente selecionado.\n");
                      strncpy(dados.urgencia,"Urgente",NCHAR);
                      break;
            case 3: printf("Muito Urgente selecionado.\n");
                    strncpy(dados.urgencia,"Muito Urgente",NCHAR);
                      break;
            default: printf("Tem de seleccionar um numero valido. Escolha de 1, 2 ou 3.\n"); break;
        }

Quando uso o strncpy neste caso como sugeriram-me dá erro no sistema...

Estou a usar correctamente?

Share this post


Link to post
Share on other sites
Localhost

Se NCHAR for maior do que o número de caracteres que dados.urgencia pode comportar a strncpy é exactamente igual à strcpy, poderá ser um problema em que estejas a passar do número de caracteres que dados.urgencia possa suportar. NCHAR tem de ser igual ao número de caracteres de dados.urgencia!


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Pois, tens de avaliar consoante o que pretendes, podes aumentar o tamanho do buffer, mas já sabes que se a diferença entre o máximo que puseste no strncpy e o máximo que a string pode comportar der > 0 podes ter o perigo de ter um buffer overflow...

Edit: Se usares a string para muita coisa o teu programa torna-se confuso, foi isso que eu percebi que estavas a querer dizer, se usas strings diferentes, podes consoante a string que fores copiar não usar o NCHAR, aliás aconselho-te a não usar um valor fixo!


here since 2009

Share this post


Link to post
Share on other sites
Juin

pois afinal o nchar nao faz qualquer diferença, o erro do sistema deve ser da abertura do ficheiro :/

    //EscreverFicheiro(dados,"basedados.txt","m");
    //EscreverProposta(dados,aut,index);



void EscreverProposta(Livro info, int aut, int indx){
    int i;
    printf("Requesitante: %s\n", info.requisitante);
    printf("Data: %d/%d/%d", info.dia, info.mes, info.ano);
    for(i=0; i<aut; i++)
        printf("Autores: %s\n\n", info.autores[i][NCHAR]);
    printf("Titulo: %s",info.titulo[NCHAR]);
    printf("Coleccao: %s\n\n", info.coleccao[NCHAR]);
    printf("Data de Publicacao: %d/%d/%d\n\n", info.diapub, info.mespub, info.anopub);
    printf("Edicao: %d º Edicao\n\n", info.edicao);
    printf("Preco: %.2f €\n\n", info.preco);
    printf("Editor: %s\n\n", info.editor);
    printf("Endereco Editor: %s\n\n", info.EndEditor);
    printf("Numero de Exemplares: %d\n\n", info.NumDeExemplares);
    printf("ISBN/ISSN: %d\n\n", info.ISBN);
    printf("Urgencia: %s\n\n", info.urgencia);
    printf("Chave: %d", indx);
}



void EscreverFicheiro(Livro propostas, char *basedadosf, char *m){
    FILE *f;
    int i;
    f=fopen(basedadosf, m);
    if (f==NULL){
        printf("ERRO DE ABERTURA DO FICHEIRO!\n");
        return;
    }
        fprintf(f,"%s; %d/%d/%d; %s; %d; %d/%d/%d; %d; %.2f; %s; %s; %s\n",
        propostas.requisitante, propostas.dia, propostas.mes, propostas.ano,
        propostas.titulo, propostas.edicao, propostas.diapub, propostas.mespub, propostas.anopub,
        propostas.coleccao, propostas.ISBN,  propostas.preco,
        propostas.editor, propostas.EndEditor,  propostas.urgencia);
        for(i=0; i<4 ;i++)
           fprintf(f,"%s;\n", propostas.autores[i]);
    fclose(f);
}

Share this post


Link to post
Share on other sites
Localhost

Sim, estás a abrir o ficheiro de uma maneira inválida que é m, acho que isso não existe

f=fopen(basedadosf, m);
    if (f==NULL){
        printf("ERRO DE ABERTURA DO FICHEIRO!\n");
        return;
    }


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Ou muito me engano ou estes printfs estão mal:

      printf("Autores: %s\n\n", info.autores[NCHAR]);
    printf("Titulo: %s",info.titulo[NCHAR]);
    printf("Coleccao: %s\n\n", info.coleccao[NCHAR]);

Share this post


Link to post
Share on other sites
Baderous

O tipo de abertura não é "m", m é uma string que é argumento da função que chama a fopen.

Share this post


Link to post
Share on other sites
Juin

estou a copiar de um ficheiro que fizemos na escola muito parecido e no qual funcionava se querem que vos mande para comproarem :/

Share this post


Link to post
Share on other sites
Localhost

Mas esse tipo de abertura não existe! A única explicação é aquela que o Baderous disse e mesmo assim acho que está mal porque tens de dizer qual o tipo de abertura... E faltam-te as aspas


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Localhost, o meu último post era para ti. O fopen está correcto, a string m é recebida como argumento da função EscreverFicheiro.

Já alteraste aquele problema dos printfs que eu tinha indicado?

Share this post


Link to post
Share on other sites
Localhost

Eu sei que era para mim e eu perguntei se não era preciso o tipo de abertura do ficheiro.


here since 2009

Share this post


Link to post
Share on other sites
Juin

sim isso ja tinha acertado mas da me um conflito ao chamar a funcao

funcoes.c:251: error: conflicting types for 'EscreverProposta'

funcoes.c:232: error: previous implicit declaration of 'EscreverProposta' was here

Livro AdicionarPropostas(int index){
    Livro dados;
    int op, aut, i;
    EscreverProposta(dados, aut, index);




void EscreverProposta(Livro info, int aut, int indx){
    int i;
    printf("Requesitante: %s\n", info.requisitante);
    printf("Data: %d/%d/%d", info.dia, info.mes, info.ano);
    for(i=0; i<aut; i++)
        printf("Autores: %s\n\n", info.autores[i]);
    printf("Titulo: %s",info.titulo);
    printf("Coleccao: %s\n\n", info.coleccao);
    printf("Data de Publicacao: %d/%d/%d\n\n", info.diapub, info.mespub, info.anopub);
    printf("Edicao: %d º Edicao\n\n", info.edicao);
    printf("Preco: %.2f €\n\n", info.preco);
    printf("Editor: %s\n\n", info.editor);
    printf("Endereco Editor: %s\n\n", info.EndEditor);
    printf("Numero de Exemplares: %d\n\n", info.NumDeExemplares);
    printf("ISBN/ISSN: %d\n\n", info.ISBN);
    printf("Urgencia: %s\n\n", info.urgencia);
    printf("Chave: %d", indx);

Nota: por favor começa a utilizar a tag [code=c]...[/code] em volta do código C.

Share this post


Link to post
Share on other sites
Metaluim

mas tu não estás a inicializar a estrutura/classe dados e depois tas a tentar aceder à cópia desse objecto criado no scope da função EscreverResposta logo nos prints não vais ter informação nenhuma, mas não deve de ser o problema acho do confliting types... Experimenta criar o protótipo dessa função:


//início do código, a seguir aos #includes e #defines
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void EscreverResposta (Livro info,
                                      int aut,
                                      int indx);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


//...


void EscreverProposta (Livro info, 
                                     int aut, 
                                     int indx)
{
    int i;

    printf("Requesitante: %s\n", info.requisitante);
    printf("Data: %d/%d/%d", info.dia, info.mes, info.ano);

    for(i=0; i<aut; i++)
        printf("Autores: %s\n\n", info.autores[i]);

    printf("Titulo: %s",info.titulo);
    printf("Coleccao: %s\n\n", info.coleccao);
    printf("Data de Publicacao: %d/%d/%d\n\n", info.diapub, info.mespub, info.anopub);
    printf("Edicao: %d º Edicao\n\n", info.edicao);
    printf("Preco: %.2f €\n\n", info.preco);
    printf("Editor: %s\n\n", info.editor);
    printf("Endereco Editor: %s\n\n", info.EndEditor);
    printf("Numero de Exemplares: %d\n\n", info.NumDeExemplares);
    printf("ISBN/ISSN: %d\n\n", info.ISBN);
    printf("Urgencia: %s\n\n", info.urgencia);
    printf("Chave: %d", indx);
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.