Я пишу следующую программу для моего класса основополагающих принципов программирования (программирование на языке C). Моя IDE дает мне ошибку компиляции для объявления «ученика», как указано в строках, где считывается ввод пользователя. Это также дает мне ошибку относительно стандартов ISO C для вложенных функций в функции letter_grade. Любая помощь будет очень оценена.C Декларация о структуре
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 20
char letter_grade(float a, float b, float c);
int main(void)
{
char temp_name[MAX];
int count=0, last, temp;
struct student {
char f_name[MAX];
char l_name[MAX];
float test1;
float test2;
float test3;
};
printf("Please enter the student's last name (Enter ZZZ to exit): ");
gets(temp_name);
while (strncmp(temp_name, "ZZZ\0", 4))
{
strncpy(student[count].l_name, temp_name, MAX+1);
printf("Please enter the students first name: ");
scanf("%s", &student[count].f_name);
getchar();
printf("Enter the first test score: ");
scanf("%f", &student[count].test1);
printf("Enter the second test score: ");
scanf("%f", &student[count].test2);
printf("Enter the third test score: ");
scanf("%f", &student[count].test3);
printf("\nPlease enter the student's last name (Enter ZZZ to exit): ");
gets(temp_name);
count++;
}
last = count;
temp = last + 1;
printf("\t\t\tStudent Grade Report");
for (last;last>=0;last--){
printf("%s, ", student[last].l_name);
printf("%s ", student[last].f_name);
printf("\t\t Grade: %c\n\n ", letter_grade(student[last].test1, student[last].test2, student[last].test2));
// printf("Test Grade: %c\n", letter_grade(85,88,82));
return 0;
}
char letter_grade(float *a, float *b, float *c)
{
float sum = *a+*b+*c;
if (sum >= 270.0f)
return 'A';
if (sum>= 240.0f && sum <270.0f)
return 'B';
if (sum>= 210.0f && sum <240.0f)
return 'C';
if (sum>= 180.0f && sum <210.0f)
return 'D';
if (sum < 180.0f)
return 'F';
}
'' l_name' является символ l_name [MAX]; ' но вы указываете 'strncpy' копировать до' MAX + 1'. Просто используйте 'strcpy'. –
настоятельно рекомендуем: последовательно вставить код. отступ после КАЖДОГО открывающего скобки '{'. unindent ПЕРЕД каждой закрывающей скобкой '}'. Предложите, чтобы каждый уровень отступа составлял 4 пробела, достаточно широкий, чтобы быть видимым даже с помощью шрифта переменной ширины. – user3629249
строка символов, как «ZZZ \ 0», автоматически получает байкер терминатора «\ 0», делая массив длиной до 5 символов. ОДНАКО, функция 'strncmp()' перестает сравнивать, когда она встречает '\ 0' в любой строке. – user3629249