2016-04-10 15 views
0

Argv kullanarak 'N' giriş parametresini alacak bir program yapmak için çalışıyorum. N değeri daha sonra kullanıcının bir kimyasal element ile ilgili satırların N değerine girmesine izin verecektir. Örneğin, bir satır,Bir struct - C programlama kullanarak girişleri düzenleme

1 Hydrogen H other_nonmetals 1.008 1 0 0 0 0 0 0 

gibi görünecek ve bir yapı kullanarak girdiyi düzenli bir şekilde tarayacak ve yazdıracağım.

Şu an iki ana sorun yaşıyorum. İlk sorun elektron değerlerinde tarama. Yukarıdaki Hidrojen örneğinde, 1 0 0 0 0 0 0'da tarama yapmam ve print_element işlevimde yeniden yazdırmam gerekir. Bunu yaptığımda, sadece 1 değeri saklanır. Tüm sıfırları ihmal etmek istiyorum ama elektron değerleri 1 0 0 0 0 0 1 ise, o zaman fonksiyonumda sadece 1 basılacaktır.

Bir sonraki sorun benim döngülerimde. print_element işlevini döngülerken, değeri olmayan ek bir öğe yazdırılır. Örneğin, kullanıcı Hydrogen ve sonra Barium için değerleri girerse, Hydro'yu, sonra tamamen boş bir unsuru, tüm sıfırlar ve ardından Barium'u basacaktır. Boş elemandan nasıl kurtulacağımı anlayamıyorum.

#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

Tutarsızca girintili olarak [Pico-style] (https://en.wikipedia.org/wiki/Indent_style#Pico_style) girinti kullanıyorsunuz. C, Pico değildir; lütfen bu stili kullanmayın. Allman'ı (bunu kullanırım) veya 1TBS'yi (birçok kişi bunu kullanır) kullanır. İyi bilinen bir stil kullanıyorsanız ve çentikleme işleminde (kodunuzun olmadığı) tamamen titizse, kodunuzu daha kolay okunur hale getirir. –

+0

Tarama döngünüz 'için (i = 0; i <= argc; i ++) { scan_element (& uno [i]); } 'ancak (i ​​= 0; i

+0

Test ve hata mesajınız eşleşmiyor: 'if (N <= 0) { printf ("HATA: Sizin, 0'dan büyük ve 20'ye eşit veya daha küçük bir tamsayı sağlamanız gerekir. \ N"); geri dönüş 0; } '- Büyük olasılıkla kullanmanız gerekir:' if (N <= 0 || N > MAX_ELEMENTS) { fprintf (stderr, "HATA: 0'dan büyük ve% d'den küçük veya ona eşit bir tam sayı sağlamalısınız. \ N", MAX_ELEMENTS); geri dönüş 1; } '(' return '' çoğu sistemde bir hata olduğunu gösterir; tüm sistemlerde güvende olmak için 'EXIT_FAILURE' yerine 1 kullanın ve' stderr 'hata bildirmek içindir. –

cevap

0

for(i=0;i<N;i++) ile for(i=0; i<=argc; i++) değiştirin.

, electrons bunun sonraki ilk 0 ve her şeyi ihmal scan_element için

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

ekleyin.

4 veya 8 byte girişten dize almak için geçerli yolu kullanmak iyi değil 92.

yerine kopyalanacak çünkü sadece, print_element yılında işaretçi geçirirseniz O hızlıdır. Bakınız How to prevent scanf causing a buffer overflow in C?.