0

I have an assignment that requires me to take a single scanf and perform some math operations to several integers. The first number in the input sets the number of integers to follow ie: 3 45 67 18 should be interpreted as N var1 var2 var3 and 4 100 23 76 92 should be interpreted as N var1 var2 var3 var4. I couldnt make the program as instructed on my first iteration but it does work as its supposed to. I accomplish storing var1 var2... varN by simply putting scanf in a loop that runs N times and storing the remaining numbers in an array n[1000]. Like I said the program works... sorta, but it doesnt work the way the assignment instructed. The sample run provided by the assignment should be:

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.

My program output is:

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.

Here is the link to my program. I have read through many of the similar questions, but most seem to trivialize the use of scanf as opposed to other methods of capturing input from the console. This post is extremely close to the answer that I am looking for except I need a dynamically set number of variables. I have a feeling I need to use the malloc function but im just not quite sure how to use it for this and still accomplish a single line of scanf input.

Thanks

Community
  • 1
  • 1
John R
  • 350
  • 2
  • 5
  • 19
  • You might be able to run `fscanf` on `stdin`. I'll do some experimentation. – Kaslai Feb 07 '13 at 19:40
  • I'm not convinced it is sensibly doable with `scanf()`. You could sort of do it with `sscanf()`, but it still isn't desirable. – Jonathan Leffler Feb 07 '13 at 19:41
  • The questions doesn't make a whole lot of sense -- you say its about scanf, but then complain that your output doesn't look right. scanf has nothing to do with output, it reads input. If your output is wrong, you need to look at how you are using printf – Chris Dodd Feb 07 '13 at 21:10
  • @Chris - My question is actually about how to assign multiple variables from a single line of scanf. I didnt really ask anything about output in terms of printf. Hence the solution ended up being the way I was using scanf, not printf. – John R Feb 07 '13 at 21:31

2 Answers2

1

Okay I tested it and you can indeed do this with 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;
}

Console log:

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


15

Edit: I never use the scanf family due to several known vulnerability issues, but it didn't even occur to me to try and use scanf. I assumed it would read to the newline, but it works just fine with scanf. Aniket's comment made me want to try it.

Kaslai
  • 2,445
  • 17
  • 17
  • 1
    `scanf()` is `fscanf()` in disguise. – Aniket Inge Feb 07 '13 at 19:51
  • I never use `scanf`. I assumed it read to the newline like `gets`. I guess that works just fine. – Kaslai Feb 07 '13 at 19:55
  • 1
    If all you are reading are number, simply don't mess with blank space characters. scanf will skip blank space, including newline characters, so don't worry about it. If you are dealing with lines, read the entire line before parsing it. – Spidey Feb 07 '13 at 21:27
1

The following code worked for me:

#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 your answer had me perplexed because i couldnt see how your code would accomplish anything different from what i did. So while I was debugging to see what scanf returned I noticed scanf actually returns after every space instead of on "enter" or "\n" like I thought. So I simplified my first for loop and everything works. So am I correct in saying that input from one scanf will satisfy variable assignments to subsequent scanf's as long as there are sufficient subsequent calls to scanf? In other words if I entered 3 25 17 during a single scanf I can then assign each of those numbers to variables with subsequent scanf calls without having to pressing enter?

scanf("%d",&var1); //(where var1=3)
scanf("%d",&var2); //(where var2=25) 
scanf("%d",&var3); //(where var3=17)
John R
  • 350
  • 2
  • 5
  • 19