Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Juin

STRNCPY

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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]);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
}

Partilhar esta mensagem


Ligação 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. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.