2016-03-15 3 views
1

я learnig как код на C. я должен создать запись для человека, с днем ​​рождения и идентификационный номер код состоит из 3 файловвозвращаемое значение 3221225477 после окончания программы

кулак заголовок

// definição do tipo 
typedef int vetor[10]; 

typedef struct 
{ 
    char nome[50]; 
    vetor nasceu; 
    vetor cpf; 
} dados ; 

void cadastro (dados*, char[50], vetor, vetor); 

, то есть определения заголовка

#include <stdio.h> 
#include <string.h> 
#include "cadastro.h" 

void cadastro (dados *usuario, char name[50], vetor ddn, vetor cpf) 
{ 
    int i; 
    strcpy(usuario->nome,name); 
    for (i = 0; i < 50; i++) 
    { 
     usuario->nasceu[i] = ddn[i]; 
    } 
    for (i = 0; i < 10; i++) 
    { 
     usuario->cpf[i] = cpf[i]; 
    } 
} 

и последнего файла использует заголовок для создания запись

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "cadastro.h" 

int preenche_cadastro (char a[],vetor b,vetor c) 
{ 
    int i; 
    printf ("inserir nome: "); 
    gets (a); 
    printf("inserir data de nascimento (campos separados por espaco): "); 
     for (i = 0; i < 3; i++) 
     { 
      scanf("%d",&b[i]); 
     } 
    printf ("inserir CPF (campos separados por espaco): "); 
    for (i = 0; i < 4; i++) 
    { 
     scanf("%d",&c[i]); 
    } 
    return (0); 
} 

int imprime_cadastro (dados usuario) 
{ 
    printf("\nnome: %s",usuario.nome); 
    printf("\ndata de nascimento: %d/%d/%d\n", usuario.nasceu[0],usuario.nasceu[1],usuario.nasceu[2]); 
    printf("CPF: %d . %d . %d - %d\n", usuario.cpf[0],usuario.cpf[1],usuario.cpf[2],usuario.cpf[3]); 
    return(0); 
} 

int main(void) 
{ 
    dados new_entry; 
    char name[50]; 
    vetor born, cpf; 
    int i; 
    preenche_cadastro (name,born,cpf); 
    cadastro(&new_entry, name, born, cpf); 
    imprime_cadastro(new_entry); 
    return (0); 
} 

я не знаю, как для отладки, но, насколько я мог судить, `вина Сегментация» происходит только на линии

return (0); 

я схожу с ума здесь , Кто-нибудь может мне помочь?

Извините за мой английский, это не родной язык

+0

Примечание: 'return' - это утверждение, а не функция. Скобки не требуются и не рекомендуются большинством программистов, поскольку они делают код менее читаемым. – Olaf

+0

Не все осуждают круглые скобки вокруг выражения после выражения 'return'. И они существенно не влияют на читаемость кода. OTOH, интервал должен быть последовательным - согласованность очень важна. –

+1

См. [Почему функция 'gets()' опасна для использования] (http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not -be-used), почему вы никогда не должны писать код, который использует 'gets()'. –

ответ

3

Вы вызывается неопределенное поведение путем доступа вне диапазона массива в строке

usuario->nasceu[i] = ddn[i]; 

в функции cadastro, а затем программа произошло аварии там.

Не ссылаться не определено. Вместо использования магического номера 10 вы должны определить количество элементов в массиве и использовать его.

Также обратите внимание, что использование значений неинициализированных переменных, имеющих длительность автоматического хранения, которые являются неопределенными, также вызывает неопределенное поведение.

исправлен заголовок:

// definição do tipo 
#define VETOR_NUM 10 
typedef int vetor[VETOR_NUM]; 

typedef struct 
{ 
    char nome[50]; 
    vetor nasceu; 
    vetor cpf; 
} dados ; 

void cadastro (dados*, char[50], vetor, vetor); 

исправлен реализация cadastro:

#include <stdio.h> 
#include <string.h> 
#include "cadastro.h" 

void cadastro (dados *usuario, char name[50], vetor ddn, vetor cpf) 
{ 
    int i; 
    strcpy(usuario->nome,name); 
    for (i = 0; i < VETOR_NUM; i++) 
    { 
     usuario->nasceu[i] = ddn[i]; 
    } 
    for (i = 0; i < VETOR_NUM; i++) 
    { 
     usuario->cpf[i] = cpf[i]; 
    } 
} 

исправлен main() функции:

int main(void) 
{ 
    dados new_entry; 
    char name[50]; 
    vetor born = {0}, cpf = {0}; /* initialize arrays */ 
    /* i is removed because it wasn't used */ 
    preenche_cadastro (name,born,cpf); 
    cadastro(&new_entry, name, born, cpf); 
    imprime_cadastro(new_entry); 
    return (0); 
} 

Еще одно замечание: Вы не должны использовать gets(), который имеет неизбежный риск переполнения буфера.

2

Ваш первый цикл должен копировать только 10 пунктов, а не 50.

for (i = 0; i < 10; i++) 
    { 
     usuario->nasceu[i] = ddn[i]; 
    } 
2

Этот цикл в вашей cadastro функции:

for (i = 0; i < 50; i++) 
{ 
    usuario->nasceu[i] = ddn[i]; 
} 

Кажется, что он не соответствует размеру nasceu arrary:

typedef int vetor[10]; 

typedef struct 
{ 
    char nome[50]; 
    vetor nasceu; 
    vetor cpf; 
} dados ; 

Вы пробовали изменения в:

for (i = 0; i < 10; i++) 
{ 
    usuario->nasceu[i] = ddn[i]; 
} 

?

Смежные вопросы