2015-07-01 2 views
0

Итак, я написал эту программу, которая получает в качестве входной строки строку, состоящую из фамилии и имени, написанную следующим образом: «james: lebron». Программа должна скопировать фамилию в переменной фамилии структуры, то же самое касается имени. Нет ошибок компиляции, просто ошибка дампа ядра. Кто-нибудь может объяснить мне почему?Программа продолжает давать мне «core dump», хотя я не могу найти почему

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

struct author{ 

    char *name; 
    char *surname; 
    }; 

typedef struct author author_t; 

author_t separate(char *string); 

int main(void){ 

    char *name_surname; 
    printf("Inserisci nome e cognome: "); 
    gets(name_surname); 
    separate(name_surname); 
    } 

author_t separate(char *string){ 

    int i, n=0; 
    author_t temp; 
    for(i=0; i<(strlen(string)-1); i++){ 

     while(string[i]!=':') 
     n++; 
     strncpy(temp.surname, string, n); 
     strncpy(temp.name, &string[n+2], (strlen(string)-n-2)); 
     } 

    return(temp); 
    } 

ответ

0

от Teh верхней части моей головы Id сказать, увеличивающиеся п не является хорошей идеей, поскольку п я steh число элементов для копирования не позицию в строке.

+0

да, но увеличивающиеся п служит мне, когда «:» встречается, п число символов, подлежащих копированию –

+0

Я не делал, что объявление структуры фактически создало экземпляр, поскольку у него нет имени после; – feet

+0

Я не думал, что объявление структуры фактически сделало экземпляр (Хранение), поскольку у него нет имени после; и не объявляет переменную. Я бы также посоветовал не использовать строку в качестве имени переменной - ее можно было бы использовать внутри компилятора, т. Е. Как защищенное имя «система» «переменная». не используйте их или ожидайте неожиданного ... – feet

0
struct author{ 

char *name; 
char *surname; 
}; 
.... 
int i, n=0; 
author_t temp; 
for(i=0; i<(strlen(string)-1); i++){ 

    while(string[i]!=':') 
    n++; 
    strncpy(temp.surname, string, n); 
    strncpy(temp.name, &string[n+2], (strlen(string)-n-2)); 
    } 

Вы не можете копировать в tmp.surname или temp.name, как вы не резервирует память еще. (Обратите внимание, что strncpy не резервирует память, он просто копирует.) char *name только резервирует место для указателя, а не фактическую строку. Пользователь char name[30] или так, или назначить память позже, как это:

author_t auth; 
auth.name = (char *) malloc(30); 

(то же самое для фамилии, конечно)