2016-04-10 2 views
0

Я работаю над созданием программы, которая будет принимать входной параметр «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; 
} 
+0

Вы используете неподходящий отступ [Pico-style] (https://en.wikipedia.org/wiki/Indent_style#Pico_style) отступ. C не является Пико; пожалуйста, не используйте этот стиль. Используйте Allman (я использую это) или 1TBS (многие люди используют это). Это делает ваш код более легким для чтения, если вы используете хорошо известный стиль и полностью строг при обработке отступов (чего нет у вашего кода). –

+0

Ваш цикл сканирования: 'for (i = 0; i <= argc; i ++) { scan_element (& uno [i]); } ', но это должно быть' for (i = 0; i

+0

Ваше тестовое сообщение и сообщение об ошибке не совпадают: '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' - для сообщений об ошибках). –

ответ

0

Заменить for(i=0; i<=argc; i++) с for(i=0;i<N;i++).

Чтобы опустить первый 0 и все после него в electrons, добавьте

char*tmp; 
if(tmp=strstr(uno->electrons," 0")) 
    *tmp=0; 

к scan_element.

Это быстрее, если вы только передать указатель в print_element, потому что 4 или 8 байт будут скопированы вместо 92.

Это не хорошо, чтобы использовать текущий способ получить строку из входного сигнала. См. How to prevent scanf causing a buffer overflow in C?.

Смежные вопросы