Извлечение значений массива в программировании на C. Как я могу исправить эти ошибки?

#c #arrays

#c #массивы

Вопрос:

это мой первый пост, поэтому прошу прощения, если я сделал это неправильно. Но я довольно новичок в программировании на C и столкнулся с препятствием. Нам был предоставлен exe-файл для создания кода с нуля. Я зашел так далеко, но у меня возникли проблемы с извлечением имен. Он сохраняет их, или так кажется, но при установке моего значения в 3 он берет из всех трех имен первые два и правильно отображает только третье имя. Это всегда правильное последнее имя. Я предоставил скриншот ниже, показывающий мои проблемы. Я довольно близок к завершению, но не могу пройти этот шаг. Любая помощь была бы очень признательна!

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


int a_delete;
char b[100]; 
int name;
int counter=0;
int F;
int d;
int grade;
int set;
int w;
int x;
int z;
char a[100];
char names[100];
char g[100];
char h[100];
char i[100];
char c[100];
char f[100];
char phy[100];
char Counter[100];
char final_grade[100];
double class_grades[100];
double total;
double totals;

int main()
{



    printf("n Welcome to the grade calculator");
    printf("n Enter the total number of students in the class:");
    fgets(a, sizeof(a), stdin);
    sscanf(a, "%d", amp;name);
    char my_data[name*3];
    char my_array[name];

    if(name<1)
    {
        printf("n Not a valid number");
        printf("n Please enter a valid integer number only");
    }
            else
            {
                for(x=0;x<name;  x)
                {
                    printf("n Please enter the students name:");
                    fgets(f, sizeof(f), stdin);
                    sscanf(f, "%s", amp;my_array[x]);

                }
                    if(x<=name)
                    {
                        for(x=0 ; x<name;  x)
                        {

                            printf("n Please enter %s's Physics score (out     of 100 points)  : ", amp;my_array[x]);
                            fgets(b, sizeof(b), stdin);
                            sscanf(b, "%d", amp;my_data[set]);

                        }

                            for(x=0;x<name;  x)
                            {

                                printf("n Please enter %s's Chemestry score (out of 100 points)  : ", amp;my_array[x]);
                                fgets(c, sizeof(c), stdin);
                                sscanf(c, "%d", amp;my_data[set]);

                            }
                                for(x=0; x<name;  x)
                                {


                                    printf("n Please enter %s's Math score     (out of 100 points)  : ", amp;my_array[x]);
                                    fgets(g, sizeof(g), stdin);
                                    sscanf(g, "%c", amp;my_data[set]);

                                }
                                    if(x=3)
                                    {
                                        for(x=0; x<=name;  x)
                                        {
                                            puts("n*****************");
                                            puts("n***Report card***");
                                            puts("n*****************");

                                            printf("Name of the student: %c", my_array[name]);

                                            printf("nPhysics: %.2f/100", my_data[set]);

                                            printf("nChemistry: %.2f/100",     my_data[set] );

                                            printf("nMath: %.2f/100", my_data[set] );


                                                if(grade>=270)
                                                {

                                                    printf("nYour letter grade: A");

                                                }
                                                        else if(my_data[set]<270>=240)
                                                        {
                                                            printf("nYour letter grade: B");
                                                        }
                                                            else if(my_data[set]<240>=210)
                                                            {
                                                                printf("nYour letter grade: C");
                                                            }
                                                                else if(my_data[set]<210>=180)
                                                                {
                                                                    printf("nYour letter grade: D");
                                                                }
                                                                    else if(my_data[set]<180)
                                                                    {
                                                                        printf("nYour letter grade: F");
                                                                    }

                                        }
            }
    }                               }

    return(0);
  

}

Комментарии:

1. char my_array[name]; Вы пытаетесь сохранить все имена в этом же массиве (с различными смещениями). Это, очевидно, не работает, потому что каждое из них sscanf перезапишет часть предыдущего имени (что вы и наблюдаете). Один из способов — иметь 2D-массив: char my_array[name][MAX_NAME_LEN];

Ответ №1:

Вы сохраняете имена в одной и той же переменной, перезаписывая последнюю при каждом вводе. Вы, кажется, неправильно понимаете массивы символов, я разберу код проблемы.

 for(x=0;x<name;  x)
{
    printf("n Please enter the students name:");
    fgets(f, sizeof(f), stdin);
    sscanf(f, "%s", amp;my_array[x]);
}
  
  1. В первой строке написано «начиная с 0, добавляйте 1 к x, пока x не станет меньше name». x — это переменная, которую вы используете для перемещения по массиву, и вы перемещаете 1 символ за раз.
  2. Переходя к fgets(), вы считываете строку от пользователя и сохраняете ее в f.
  3. наконец, sscanf() копирует строку в amp;my_array[x]. Это проблемная часть кода. Здесь вы копируете данные, которые пользователь только что ввел в my_array, начиная с позиции x.

Итак, для вашего примера ввода, вот как это выглядит:

  1. my_array == { ‘s’, ‘a’, ‘m’, » } когда x == 0
  2. my_array == { ‘s’, ‘d’, ‘e’, ‘a’, ‘n’, » } когда x == 1
  3. my_array == { ‘s’, ‘d’, ‘b’, ‘o’, ‘b’, ‘b’, ‘y’, » } когда x == 2

Обратите внимание, что он сдвигает один символ за раз вправо, это x, добавляемый в каждый цикл. Символ char содержит только один символ, это не то же самое, что строка символов или массив символов. Вероятно, вы пытаетесь сделать что-то вроде этого:

 for(x=0;x<name;  x)
{
    printf("n Please enter the students name:");
    fgets(f, sizeof(f), stdin);
    sscanf(f, "%s", amp;my_array[x*100]);
}
  

Кроме того, когда вы определяете my_array и несколько других ваших переменных, ваши размеры довольно неясны. Обратите внимание, что когда вы определяете my_array и вводите 3, вы предоставляете ему только 3 символа пространства для записи. Все, что после, является неопределенным поведением, но в основном оно начнет помещать данные в места, которые вы, возможно, не хотите или не ожидаете. Вы также должны инициализировать этот массив следующим образом:

 char my_array[100*name];
  

Надеюсь, этот ответ прояснил для вас некоторые вещи. Я рекомендую вам провести некоторое исследование примитивных типов данных и массивов в c. Другим возможным решением вашей проблемы является реализация 2D-массива.

Комментарии:

1. Это определенно помогло многое прояснить, теперь у меня есть это, где я, наконец, получаю первое имя, которое появляется, и теперь каждый раз просто убирает букву. Должен ли я создать новый массив, чтобы вызвать следующее имя, следуя тому же способу кодирования, или я просто меняю переменную?