0

単一の scanf を取得し、複数の整数に対していくつかの数学演算を実行する必要がある割り当てがあります。入力の最初の数値は、続く整数の数を設定します。つまり、3 45 67 18 は N var1 var2 var3 と解釈され、4 100 23 76 92 は N var1 var2 var3 var4 と解釈されます。最初の繰り返しで指示どおりにプログラムを作成できませんでしたが、想定どおりに機能します。var1 var2... varN の格納は、scanf を N 回実行するループに入れ、残りの数値を配列 n[1000] に格納するだけで完了します。私が言ったように、プログラムは動作します...ちょっと、しかし、割り当てが指示したようには動作しません。割り当てによって提供されるサンプル実行は次のようになります。

Please enter n followed by n numbers: 3 6 12 17

Test case #1: 6 is NOT abundant.
Test case #2: 12 is abundant.
Test case #3: 17 is NOT abundant.

私のプログラムの出力は次のとおりです。

Please enter n followed by n numbers: 3
6
12
17
Test case #1: 6 is NOT abundant.
Test case #2: 12 is abundant.
Test case #3: 17 is NOT abundant.

これが私のプログラムへのリンクです。私は同様の質問の多くを読みましたが、コンソールから入力をキャプチャする他の方法とは対照的に、ほとんどが scanf の使用を矮小化しているようです。この投稿は、動的に設定された数の変数が必要であることを除いて、私が探している答えに非常に近いものです。私は malloc 関数を使用する必要があると感じていますが、これを使用する方法がよくわからず、それでも 1 行の scanf 入力を実行できます。

ありがとう

4

2 に答える 2

1

次のコードは私のために働いた:

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    int n[1000],i,j,sum,size;

    printf("Please enter n followed by n numbers: ");
    scanf("%d",&n[0]);

    for (i=1;i<=n[0];i++)
            scanf("%d",&n[i]);

        /* Debug: Automatically generate numbers from 1 to n[0] */
        //n[i]=i

    for (i=1;i<=n[0];i++)
    {
        /* Debug: See what numbers are being used in sum - Part 1*/
        //printf("\nFactors < %d of %d: ",n[i]/2,n[i]);
        sum=0;
        for (j=1;j<=n[i]/2;j++)
        {

            if (n[i]%j==0)
            {
                /* Debug: See what numbers are being used in sum - Part 2*/
                //printf("%d ",j);
                sum+=j;
            }

        }
        printf("Test case #%d: %d is%sabundant.\n",i,n[i],(sum>n[i])?" ":" NOT ");

        /* Debug: See what numbers are being used in sum - Part 3*/
        //printf("(%d)\n",sum);
    }
    system("PAUSE");    
    return 0;
}

Aslaiあなたの答えは、あなたのコードが私がしたこととは異なる何かをどのように達成するかを私が見ることができなかったので、私を当惑させました。したがって、scanfが何を返すかをデバッグしているときに、scanfが、思ったように「enter」または「\ n」ではなく、すべてのスペースの後に実際に戻ることに気付きました。そこで、最初のforループを単純化すると、すべてが機能します。それで、1つのscanfからの入力は、scanfへの後続の呼び出しが十分にある限り、後続のscanfへの変数の割り当てを満たすと言っているのは正しいですか?言い換えると、1回のscanf中に3 25 17と入力した場合、Enterキーを押すことなく、後続のscanf呼び出しでこれらの各番号を変数に割り当てることができますか?

scanf("%d",&var1); //(where var1=3)
scanf("%d",&var2); //(where var2=25) 
scanf("%d",&var3); //(where var3=17)
于 2013-02-07T21:24:28.370 に答える
1

さて、私はそれをテストしましたが、実際に でこれを行うことができますscanf

#include<stdio.h>

int main(){
    int total = 0;
    int args;
    char newline;
    do{
        int temp; 
        args = scanf( "%d%c", &temp, &newline );
        if( args > 0 )
            total += temp;
        puts( "Internal loop print test");
    } while( newline != '\n' );
    printf( "\n\n%d", total );
    return 0;
}

コンソール ログ:

1 2 3 9
Internal loop print test
Internal loop print test
Internal loop print test
Internal loop print test


15

編集:scanf既知の脆弱性の問題がいくつかあるため、ファミリを使用することはありませんが、scanf. 私はそれが改行まで読み込まれると思っていましたが、scanf. アニケットさんのコメントを見て、やってみたくなりました。

于 2013-02-07T19:50:44.867 に答える