2014-12-05 3 views
1

У меня есть программа, которую я использую (тихая, простая), которая требует ввода от пользователя с помощью scanf. Эти значения хранятся в массиве struct. В любом случае, я думаю, что у меня есть весь синтаксис правильно (если я не исправляю меня), но всякий раз, когда я хочу распечатать f, чтобы увидеть результаты, я не получаю значение из ID [i] .Middle_Name. Кажется, что это пусто, по причинам, которые я не понимаю. Я попытался добавить заявление печати, чтобы попытаться отладить его, но все равно ничего. Может, я что-то упустил?Проблемы с scanf()

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

struct Students{ 
    char First_Name[20]; 
    char Last_Name[20]; 
    char Middle_Name[20]; 
    int Age; 
}; 

int main(void){ 
    int n = 0; //number of students 
    int i = 0;  //counter 

    printf("Please enter the total number of students in your class: "); 
    scanf("%d", &n); 
    struct Students ID[n]; 
    printf("\n"); 

    printf("******************** \n"); 
    printf("After entering student info, they are displayed in full_name/middle_name/age order. \n"); 
    printf("******************** \n"); 

    for(i = 1; i <= n; i++){ 
     printf("Please enter the first name of student with ID: %d \t", i); 
     scanf("%s", (ID[i].First_Name)); 
     printf("\n"); 

     printf("Please enter the last name of student with ID: %d \t", i); 
     scanf("%s", (ID[i].Last_Name)); 
     printf("\n"); 

     printf("Please enter the middle name of student ID: %d \t", i); 
     scanf("%s", (ID[i].Middle_Name)); 
     printf("\n"); 

     printf("Please enter the age of student ID: %d \t", i); 
     scanf("%d", &(ID[i].Age)); 
     printf("\n"); 

    } 
    printf("In your class, we have: \n"); 
    printf("%s", ID[1].Middle_Name); 

    for(i = 1; i <= n; i++){ 
     printf("%s \t", ID[i].First_Name); 
     printf("%s \t", ID[i].Last_Name); 
     printf("%s \t", ID[i].Middle_Name); 
     printf("%d \n", ID[i].Age); 
    } 
    return(0); 
} 
+0

Каков ваш входной формат? – timrau

+0

начальный индекс в C равен 0, а не 1, поэтому ваш for должен начинаться с i = 0 – user411313

ответ

1

Вы должны начать с i = 0 вместо i = 1, чтобы получить первый элемент вашего массива. И вы должны заменить i <= n на i < n.

for(i = 0; i < n; i++) 
{ 
    ... 
} 
+0

Спасибо за то, что посмотрели на это, и удивительно, что это решило. Можете ли вы объяснить, почему так было? Почему это было похоже на мой предыдущий метод. Не должно ли существовать значение ID [i] .Middle_Name независимо от положения массива? – RenegadeJ

+0

@RenegadeJ Первый элемент массива находится в индексе 0. Написав 'ID [1] .Middle_Name', вы искали среднее имя второго элемента вашего массива. Если вы проводили тесты только с одним элементом в вашем массиве, идентификатор [1] не существует и должен приводить к ошибке. Другими словами, если вы создадите массив из 10 элементов, последний элемент будет иметь индекс 9 и первый в индексе 0. – Aleph0

0

Я хотел бы предложить, чтобы заменить зсапЕ ("% s", идентификатор [я]. ...) с получает, например.

gets(ID[i].Middle_Name); 

А также начинаются с 0 в цикле вместо 1

для (я = 0; я < п; я ++) { ..... }

+0

Спасибо за подсказку. Кроме того, начало с 0 фактически фиксировало его. Вы случайно не знаете, почему это так? Я имею в виду, что не имеет значения, где он начинается, пока вы обращаетесь к тому же/правильному индексу массива, правильно? – RenegadeJ

+0

Вы правы. Если вы случайно нажали пробел в фамилии, это тоже могло вызвать это. –

-1

там неправильный синтаксис в коде

struct Students ID[n]; 

длиной массива должна быть константным числом, или вы можете использовать новым, как это

struct Students *ID = new struct Students[n]; 
+1

ID [n] является правильным, является VLA. Ваш «новый» - это C++, а не C. – user411313

+0

@ user411313 ok, я получаю, спасибо – Robin

0
for(i = 0; i <= n; i++) 
{ 

//Your input code 

} 

for(i = 0; i <= n; i++) 
{ 

     // your output code 

} 
+0

Вы будете слишком много циклов, если будете сохранять это условие. Вы должны заменить 'i <= n' на 'i Aleph0

+0

да, вы правы. Спасибо –

+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. –

-1
// <-- note leading ' ' on all format strings 
// <-- always check returned value from input statements 
// <-- following line would try to access past end of array, 
//  arrays start with offset of 0, 
//  for(i = 1; i <= n; i++) 

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

struct Students 
{ 
    char First_Name[20]; 
    char Last_Name[20]; 
    char Middle_Name[20]; 
    int Age; 
}; 

int main(void){ 
    int n = 0; //number of students 
    int i = 0;  //counter 

    printf("Please enter the total number of students in your class: "); 
    if(1 != scanf(" %d", &n)) 
    { 
     perror("scanf failed reading num students"); 
     exit(EXIT_FAILURE); 
    } 

    struct Students ID[n]; 
    printf("\n"); 

    printf("******************** \n"); 
    printf("After entering student info, they are displayed in full_name/middle_name/age order. \n"); 
    printf("******************** \n\n"); 


    for(i=0; i< n; i++) 
    { 
     printf("Please enter the first name of student with ID: %d \t", i+1); 
     if(1 != scanf(" %s", (ID[i].First_Name))) 
     { 
      perror("scanf failed for first name"); 
      exit(EXIT_FAILURE); 
     } 

     printf("\n"); 

     printf("Please enter the last name of student with ID: %d \t", i+1); 
     if(1 != scanf(" %s", (ID[i].Last_Name))) // <-- check returned value 
     { 
      perror("scanf failed for last name"); 
      exit(EXIT_FAILURE); 
     } 

     printf("\n"); 

     printf("Please enter the middle name of student ID: %d \t", i+1); 
     if(1 != scanf(" %s", (ID[i].Middle_Name))) // <-- check returned value 
     { 
      perror("scanf failed for middle name"); 
      exit(EXIT_FAILURE); 
     } 

     printf("\n"); 

     printf("Please enter the age of student ID: %d \t", i+1); 
     if(1 != scanf(" %d", &(ID[i].Age))) // <-- check returned value 
     { 
      perror("scanf failed for student age"); 
      exit(EXIT_FAILURE); 
     } 

     printf("\n"); 
    } // end while 

    printf("In your class, we have: \n"); 
    printf("%s", ID[1].Middle_Name); 

    // <-- following line would try to access past end of array, arrays start with offset of 0, not 1 
    //for(i = 1; i <= n; i++) 
    for(i=0; i<n; i++) 
    { 
     printf("%s \t", ID[i].First_Name); 
     printf("%s \t", ID[i].Last_Name); 
     printf("%s \t", ID[i].Middle_Name); 
     printf("%d \n", ID[i].Age); 
     printf("\n"); // put each student on a new line 
    } // end for 
    return(0); 
} 
Смежные вопросы