2016-04-10 12 views
0

私は、argvを使用して入力パラメータ 'N'を取るプログラムを作ることに取り組んでいます。値Nは、ユーザが化学元素に関する線のN値を入力することを可能にする。たとえば、ある行はstruct-Cプログラミングを使用して入力を整理する

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

のようになります。構造体を使用して、入力をスキャンして組織的な問題で印刷します。

私は現在2つの主な問題を抱えています。第1の問題は、電子値を走査することである。上記の水素の例では、私は1 0 0 0 0 0 0でスキャンし、私の関数print_elementでそれを再印刷する必要があります。これを行うと、値1だけが保存されます。すべてのゼロを省略したいのですが、電子値が1 0 0 0 0 0 1の場合、私の関数には1だけが出力されます。

私が持っている次の問題は私のforループです。関数print_elementをループしている間に、値のない余分な要素が出力されます。たとえば、ユーザーが水素とそれからバリウムの値を入力すると、Hydrogenと完全に空白の要素がすべてゼロで出力され、その後バリウムが出力されます。私は空の要素を取り除く方法を理解できません。

#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はピコではない。そのスタイルを使わないでください。オールマン(私はそれを使用します)または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、 "ERROR:0より大きく、%d以下の整数を指定する必要があります。\ n"、MAX_ELEMENTS); リターン1; } '(' return 1'はほとんどのシステムでは失敗を示し、すべてのシステムで安全であるためには1の代わりに 'EXIT_FAILURE'を使用し、エラーを報告するためには' stderr'を使用します)。 –

答えて

0

for(i=0; i<=argc; i++)for(i=0;i<N;i++)に置き換えます。

scan_element

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

を追加し、electronsの最初の0とそれの後に、すべてを省略します。

あなただけprint_elementにポインタを渡す場合は4つのまたは8バイトではなく92

でコピーされますので、それは入力から文字列を取得するためにあなたの現在の方法を使用することが良くありません、高速です。 How to prevent scanf causing a buffer overflow in C?を参照してください。

関連する問題