Я работаю над созданием программы, которая будет принимать входной параметр «N», используя argv. Затем значение N позволит пользователю ввести в N значение строк о химическом элементе. Например, одна строка будет выглядеть так:Организация ввода с использованием программирования struct-C
1 Hydrogen H other_nonmetals 1.008 1 0 0 0 0 0 0
и используя структуру, я буду сканировать и печатать ввод в организованном виде.
В настоящее время у меня есть две основные проблемы. Первая проблема - сканирование в электронных значениях. В приведенном выше примере водорода, мне нужно было бы сканировать в 1 0 0 0 0 0 0
и перепечатать его в моей функции print_element
. Когда я это делаю, сохраняется только значение 1. Я хочу, чтобы все нули были опущены, но если значения электронов были 1 0 0 0 0 0 1
, тогда в моей функции будет напечатано только 1.
Следующая проблема, с которой я столкнулась, заключается в моих циклах. При циклизации функции print_element
будет напечатан дополнительный элемент без значений. Например, если пользователь вводит значения для Hydrogen, а затем Barium, он будет печатать водород, а затем совершенно пустой элемент со всеми нулями, а затем Barium. Я не могу понять, как избавиться от пустого элемента.
#include <stdio.h>
#include <stdlib.h>
#define MAX_ELEMENTS 20
typedef struct{
int num;
char name[MAX_ELEMENTS];
char symbol[MAX_ELEMENTS];
char class[MAX_ELEMENTS];
double weight;
char electrons[MAX_ELEMENTS];
} element_t;
void scan_element(element_t *uno){
scanf("%d %s %s %s %lf %20s", &uno->num, uno->name, uno->symbol, uno->class, &uno->weight, uno->electrons);
}
void print_element(element_t uno){
printf("---------------\n| %d\t%.4f\n| %s\t%s\n| %s\n---------------\n", uno.num, uno.weight, uno.symbol, uno.name, uno.electrons);
}
int main (int argc, char *argv[]){
int i;
if (argc != 2){
printf("ERROR: You must provide exactly one argument to this program.\n");
return 0; }
int N = (int)strtol(argv[1], NULL, 10);
if(N <= 0){
printf("ERROR: Your must provide an integer greater than 0 and less than or equal to 20.\n");
return 0; }
element_t uno[MAX_ELEMENTS];
for(i=0; i<=argc; i++){
scan_element(&uno[i]); }
printf("%d total elements.\n", N);
printf(" had the smallest atomic number.\n");
printf(" had the largest atomic number.\n");
for(i=0; i<=argc; i++){
print_element(uno[i]); }
return 0;
}
Вы используете неподходящий отступ [Pico-style] (https://en.wikipedia.org/wiki/Indent_style#Pico_style) отступ. C не является Пико; пожалуйста, не используйте этот стиль. Используйте Allman (я использую это) или 1TBS (многие люди используют это). Это делает ваш код более легким для чтения, если вы используете хорошо известный стиль и полностью строг при обработке отступов (чего нет у вашего кода). –
Ваш цикл сканирования: 'for (i = 0; i <= argc; i ++) { scan_element (& uno [i]); } ', но это должно быть' for (i = 0; i
Ваше тестовое сообщение и сообщение об ошибке не совпадают: 'if (N <= 0) { printf («ОШИБКА: ваше должно содержать целое число больше 0 и меньше или равно 20. \ n"); return 0; } '- Вероятно, вы должны использовать:' if (N <= 0 || N > MAX_ELEMENTS) { fprintf (stderr, "ОШИБКА: ваше должно содержать целое число больше 0 и меньше или равно% d. \ N", MAX_ELEMENTS); return 1; } '(' return 1' указывает на сбой в большинстве систем, используйте 'EXIT_FAILURE' вместо 1, чтобы быть безопасным для всех систем, а' stderr' - для сообщений об ошибках). –