#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]);
}
- В первой строке написано «начиная с 0, добавляйте 1 к x, пока x не станет меньше name». x — это переменная, которую вы используете для перемещения по массиву, и вы перемещаете 1 символ за раз.
- Переходя к fgets(), вы считываете строку от пользователя и сохраняете ее в f.
- наконец, sscanf() копирует строку в amp;my_array[x]. Это проблемная часть кода. Здесь вы копируете данные, которые пользователь только что ввел в my_array, начиная с позиции x.
Итак, для вашего примера ввода, вот как это выглядит:
- my_array == { ‘s’, ‘a’, ‘m’, » } когда x == 0
- my_array == { ‘s’, ‘d’, ‘e’, ‘a’, ‘n’, » } когда x == 1
- 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. Это определенно помогло многое прояснить, теперь у меня есть это, где я, наконец, получаю первое имя, которое появляется, и теперь каждый раз просто убирает букву. Должен ли я создать новый массив, чтобы вызвать следующее имя, следуя тому же способу кодирования, или я просто меняю переменную?