2016-11-13 2 views
0
#include <stdio.h> 
#include <conio.h> 

#define STUD 3 

struct students { 
    char name[30]; 
    int score; 
    int presentNr; 
} student[STUD]; 

void main() { 
    for (int i = 1; i <= STUD; i++) { 
    printf("Name of the student %d:\n", i); 
    scanf("%[^\n]s", student[i].name); 

    printf("His score at class: "); 
    scanf("%d", &student[i].score); 

    printf("Number of presents at class: "); 
    scanf("%d", &student[i].presentNr); 
    } 
    getch(); 
} 

Привет, ребята! Я хочу сохранить в структуре имя студента и его оценку в классе. В первом цикле я могу хранить несколько слов в переменной «name», но во втором цикле он перескакивает.Несколько слов в строке C

+4

В массивах C используется индексирование с нулевым индексом. Проведите цикл от 0 до '

+1

Должен 'void main() {' быть 'int main'? –

+0

Не использовать scanf() для строк, используйте fgets(): http://www.cplusplus.com/reference/cstdio/fgets/ – Gaulthier

ответ

-1

Во-первых: вам нужно запустить свой цикл с нулем (i = 0), потому что массивы C основаны на нуле.

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

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

#define STUD 3 

struct students { 
    char name[30]; 
    int score; 
    int presentNr; 
} student[STUD]; 

void clean_stdin(void) 
{ 
    char c; 
    do c = getchar(); while (c != '\n' && c != EOF); 
} 

int main() { 
    for (int i = 0; i < STUD; i++) { 

    printf("Name of the student %d:\n", i + 1); 
    fgets((char*)&student[i].name, 30, stdin); 

    // Remove the line break at the end of the name 
    student[i].name[strlen((char*)&student[i].name) - 1] = '\0'; 

    printf("His score at class: "); 
    scanf("%d", &student[i].score); 

    printf("Number of presents at class: "); 
    scanf("%d", &student[i].presentNr); 

    // cleans stdin buffer 
    clean_stdin(); 
    } 

    getchar(); 
} 

Примечание: Там встроенная функция (fflush()) промывать входной буфер, но иногда, по какой-то причине он не работает, поэтому мы используем пользовательский clean_stdin() функцию.

+0

Теперь работайте! Спасибо. Я думаю, проблема была решена с вашей функцией clean_stdin(); еще раз спасибо! –

+0

Нет проблем. Просто добавлена ​​строка для удаления '\ n' в конце имени. – karliwson

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