2017-12-03 11 views
-1

私は提出する必要があるCのプロジェクトに問題があります。私はNとN^2の整数を取得し、マジックスクエアを作成するかどうかをチェックするプログラムを書くように求められました。標準入力(Stdin)からN^2の整数を得たことをどのように確認できますか?

しかし、私は入力が標準入力であったはずだと思いましたが、printfを使ってNを指定してスキャンしてから、ユーザーに入力するように要求したので、 N^2の整数とマジックスクエアを作成するかどうかをチェックします。しかし、私はstdinからそれを行う方法を知らない。

入力は、sizeofN、N1、N2、...、N^2の形式でなければなりません。例えば:3 8 1 6 3 5 7 4 9 2 - 3がNであり、他の要素が後になることを意味します。

ので、私の質問は以下のとおりです。

1)私が述べたように、スタンダール入力(stdin)から値を取得する方法を教えてください。 while((c = getchar())!= EOF)のようなものか、よりスマートな方法がありますか?

2)本当にN^2個のアイテムがあるかどうかを確認するにはどうすればよいですか? (最初の数はNで、後ろにN^2個の入力があるはずです。たとえば、次のようになります。3 8 1 3 4 5 9 8 5 Nは3で9個の整数が必要ですが、 8、どのように私は本当にN^2の数字がNを取得していることをチェックする関数を書くことができますか?

私はすでに与えられた行列がマジックスクエアを形成するかどうかをチェックするプログラムをプログラムしました。 STDIN。

。だから私は理解し、学ぶことができるコードを提供し、あなたの親切に助けをどうもありがとうございました。

+0

をチェック! – sepp2k

+0

あなたは良いプログラマーであり、エラーのための*入力操作の結果を常にチェックします。これは簡単です:あなたのプログラムがN^2の整数を読み出すのに成功するならば、あなたは確かに "N^2個の整数を得ました" –

+0

あなたのタイトルは* "あなたは検証したい"と言っていますが、ボディは確認について何も言わない... –

答えて

2

まず最初の数

を取得してください。

これで本当にいい数字かどうかを検証します。

if(N <= 0){ 
     fprintf(stderr,"Enter integral N >= 1"); 
     exit(1); 
    } 

は今scanf()とこのソリューションで

for(size_t i = 0; i < N*N; i++){ 
     if(scanf("%d",&a[i]) != 1){ 
      fprintf(stderr,"Enter integral N >= 1"); 
      exit(1); 
     } 
    } 

、以上のループが、あなたはので、整数が正しく入力反復ごとにN^2数値を得ました。

getchar()を使用することはお勧めできません。 size>=4のすべてのマジックスクエアに少なくとも2桁の数字があるからです。 getchar()を使用してそれらを直接取得することはできません。それ以外の場合は、getchar()という1つのオプションですが、不必要に複雑なものを整数値にする必要があります。

また、入力より多くの番号が必要な場合、または入力の取得をさらに細かく制御する場合は、fgets()を使用して一度に行を読み取り、intに解析することができます。これらは、プログラムへの引数として提供されている場合


は、あなたは簡単にargcargvを使用して、検証の一部を行うことができます。与えられた入力の数が正しいかどうかをチェックしたいとします。

だから、標準入力でない場合は、現在それを読んでいるところから、

int main(){ 
    char *ptr; 
    int N; 
    errno = 0; 
    if(argc > 2){ 
     long NN = strtol(argv[1], &ptr, 10); 
     if (errno != 0 || *p != '\0' || NN > INT_MAX || NN < INT_MAX) { 
      fprintf(stderr, "%s\n", "Error in parsing"); 
      exit(1); 
     } 
     else{ 
      N = (int)NN; 
     } 
    } 
    int totalElmts = N*N; 

    if(N && totalElmts/N != N){ 
     fprintf(stderr, "%s\n","Overflow"); 
    } 
    if(argc != (totalElmts + 2)){ 
     fprintf(stderr, "%s %s %s\n",argv[0],"N","NxN elements"); 
    } 
    for(size_t i = 2; argv[i] != NULL; i++) 
    { 
     //convert argv[i] to `int` 
    } 
    ... 
    return 0; 
} 
関連する問題