2014-01-06 1 views
1

Моя проблема выглядит очень простой, и мне так жаль, что спрашивали, но что случилось с этим кодом ?! почему просто пропуская название?Почему моя функция «получает» не может получить строку?

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 
#define nl printf("\n") 

struct date{int day,month,year;}; 
struct student{long int id;char name[30];struct date birthday;}; 

int main() 
{ 
    struct student temp; 
    nl;nl;printf("ID no:");scanf("%ld",&temp.id);nl; 
    printf("Student name:"); 
    gets(temp.name); 
    nl;nl; 
    printf("Student birthday year:19");scanf("%d",&temp.birthday.year);nl; 
    printf("Student birthday month");scanf("%d",&temp.birthday.month);nl; 
    printf("Student birthday day");scanf("%d",&temp.birthday.day);nl; 
    getch();  //for pause 
    return 0; 
} 

Есть ли что-то неправильное в получении функции ?! потому что я не хочу использовать scanf("%s",) из-за пробега ...

+0

Относительно _ «Студенческий год рождения: 19» _, вы пишете это для этого столетия? – ryyker

+0

Я новый программист, жаль, что у меня нет знаний ... – amfad33

+4

'#define nl printf (" \ n ")' ужасно C и никогда не должен быть в программе. – abelenky

ответ

1

Это потому, что он читает символ \n, оставленный scanf. Использовать

int ch; 
while((ch = getchar()) != '\n' && ch != EOF); 

Потребление \n.

И лучше не использовать gets, поскольку он терпит неудачу в проверке привязки массива. Вместо этого используйте fgets.

+1

* Не используйте * get', как объяснялось. Используйте 'fgets' и читайте с' stdin'. 'gets' очень небезопасен, так как есть много проблем с ним: см. [здесь для основного объяснения] (http://c-faq.com/stdio/getsvsfgets.html). – SevenBits

0

Как говорится в hacce, вы не должны использовать gets(), но если вы действительно хотите использовать его в своем коде, используйте gets() перед идентификатором no. т.е. после строки struct student temp;, и если вы хотите распечатать ее, просто нажмите puts(temp.name).