2016-11-12 3 views
-2

Это мой код о получении информации о студенте.Ядро отказа от сегментации (сбрасывается)

#include <stdio.h> 

struct det{ 
    char fname[25], lname[25], shift[10], sec[2]; 
    int roll, clss, id; 
}; 

int details(); 

int main(){ 
    details(); 

    getchar(); 
    getchar(); 

    return 0; 
} 

int details(){ 
    char rl; 
    FILE *fp; 
    struct det n; 

    printf ("\n Enter Student Informations Below : \n\n"); 

    printf (" First Name : "); 
    scanf ("%s",&n.fname); 

    printf (" Last Name : "); 
    scanf ("%s",&n.lname); 

    printf (" Roll : "); 
    scanf ("%d",&n.roll); 

    rl = (char) n.roll + ".txt"; 

    fp = fopen(rl, "w"); 

    printf (" ID : "); 
    scanf ("%d",&n.id); 

    printf (" Class : "); 
    scanf ("%d",&n.clss); 

    printf (" Shift : "); 
    scanf ("%s",&n.shift); 

    printf (" Section : "); 
    scanf ("%s",&n.sec); 

    // Works fine till here. Shows in console that segmentation fault, core dumped. 

    fprintf (fp, "\n Name : %s %s\n", n.fname, n.lname); 
    fprintf (fp, " Class : %d\n Roll : %d\n ID : %d\n", n.clss, n.roll, n.id); 
    fprintf (fp, " Section : %s\n Shift : %s\n", n.sec, n.shift); 

    fclose(fp); 

    printf ("\n\n Details Stored.\n\n Press Enter To Exit..."); 

    return 0; 
} 

Работы хорошо до отмеченной линии. Но затем я получаю это сообщение на консоли «Ошибка сегментации». Ядро (Демпинговый). Может кто-нибудь, пожалуйста, скажите мне, что не так в коде и как его исправить?

+0

Запустили ли вы свой код через отладчик? Или с чем-то вроде valgrind? – Evert

+0

Вы смотрели какие-либо предупреждения компилятора? Обязательно включите их все, и не игнорируйте их, если вы не уверены в них. – Evert

+0

Как минимум правильно отформатируйте свой код. Еще лучше приложите усилия, чтобы попытаться понять, где ваша программа идет не так (с помощью отладчика или вставлять отладочные заявления), и включать результаты такого расследования в вопрос. – davmac

ответ

1

Проблема № 1

char fname[25]; 
scanf ("%s",&n.fname); 

Как пояснил elsewhere, это может показаться на работу, но это неправильно. Используйте scanf("%s", fname);

Проблема № 2

rl = (char) n.roll + ".txt"; 

Это утверждение не конкатенации строк, как вы, вероятно, имел в виду, чтобы сделать; двоичный оператор + в C не работает так. Что происходит здесь:

  • ".txt" является выражением типа «указатель на char», что указывает на первый элемент последовательности (C11 6.3.2.1p3)
  • (char) n.roll бросает int к более узкому целого типа, char, и, таким образом, отбрасывает некоторую информацию. Если вам нужен char, используйте char, в противном случае документ своей цели
  • (char) n.roll имеет целочисленный тип, поэтому, если его значение N находится в диапазоне [0, 4], результат имеет тип «указатель на char» и точки к N-й элемент массива объектов, в противном случае поведение не определено (C11 6.5.6p8)
  • результат присваивается rl, который имеет тип char, который означает, что вы пытаетесь присвоить указатель на целое число (и должно быть указано предупреждение, в котором точно указано)

Если вы хотите, чтобы безопасно создать строку символов, которая содержит строку вида «NNN.txt», вы используете функции форматирования строки, как snprintf:

char buffer[MAXIMUM_FILENAME_SIZE]; 
snprintf (buffer, sizeof buffer, "%d.txt", n.roll); 

Затем проверить на наличие ошибок и обрабатывать их соответствующим образом.

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