Home > Software engineering >  How to create a for loop in C that takes in all integers in a single line?
How to create a for loop in C that takes in all integers in a single line?

Time:09-15

I am new to C and I was wondering how I would create a for loop that takes in a series of integers on the same line. So for example:

Input: 2 3 1

Output:

You entered 2

You entered 3

You entered 1

CodePudding user response:

The task is not simple for beginners like you and me.

As I have understood the user can enter any number of integers in one line and all entered integers in the line must be outputted like

You entered 2

In this case neither array nor character array nor integer array will help. And in fact you need not to define an array if you want only to output numbers stored in the input buffer.

In this case you can just use the standard function getchar. Using the function in a loop you can read all numbers placed by the user in one line in the I/O buffer.

Here is a sample program. It is a little complicated because I allow the user to enter sign symbols.

There is no check in the program whether the user entered not a digit or a sign. You can develop the program further. The program demonstrates an approach to solve the task.

#include <stdio.h>
#include <ctype.h>

int main( void )
{
    const int Base = 10;

    printf( "Enter a seria of integer numbers in one line: " );

    int c;
    int sign = 0;
    int num = 0;
    do
    {
        c = getchar();

        if (c == EOF || c == '\n' )
        {
            if (sign)
            {
                printf( "You entered %d\n", num );
            }
        }
        else if (isblank( ( unsigned char )c ))
        {
            if (sign)
            {
                printf( "You entered %d\n", num );
                sign = 0;
                num = 0;
            }
        }
        else
        {
            if (c == '-' || c == ' ')
            {
                if (sign)
                {
                    printf( "You entered %d\n", num );
                    num = 0;
                }
                sign = c == '-' ? -1 : 1;
            }
            else if (isdigit( ( unsigned char )c ))
            {
                c -= '0';

                if (sign == 0) sign = 1;

                if (sign == 1)
                {
                    num = Base * num   c;
                }
                else
                {
                    num = Base * num - c;
                }
            }
        }
    } while (c != EOF && c != '\n');
}

The program output might look for example like

Enter a seria of integer numbers in one line: 1 -1  12-12 13  14 -15
You entered 1
You entered -1
You entered 12
You entered -12
You entered 13
You entered 14
You entered -15

CodePudding user response:

int array[100];
int n;

scanf("%d", &n);

for(int i=0; i<n; i  ) {
    scanf("%d", &array[i]);
}

for(int i=0; i<n; i  ) {
    printf("You entered %d \n", array[i]);
}

We use the array to get all of the values, and just print them out at the end.
In C and C it does not matter if the values are separated by space or a newline, so you can get every integer in a single line if separated by spaces.

output


3
1 2 3
You entered 1 
You entered 2 
You entered 3

CodePudding user response:

fgets can be used to read a line.
strtol can parse integers and report overflow and invalid input.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>

int parselint ( char *line, int *value, char **end) {
    long int number = 0;

        errno = 0;
        number = strtol ( line, end, 10);
        if ( *end == line) {// nothing was parsed. no digits
            size_t span = strcspn ( *end, "- 0123456789"); // characters to next int
            if ( ! span) {
                span = 1;
            }
            fprintf ( stderr, "problem parsing: %.*s\n", (int)span, line);
            *end  = span; // advance pointer to next int
            return 0;// return failure
        }
        if ( ( errno == ERANGE && ( number == LONG_MAX || number == LONG_MIN))
        || ( errno != 0 && number == 0)) {// parsing error from strtol
            fprintf ( stderr, "problem %.*s", (int)(*end - line), line);
            perror ( " ");
            return 0;
        }
        if ( number > INT_MAX || number < INT_MIN) {
            fprintf ( stderr, "problem %.*s ", (int)(*end - line), line);
            fprintf ( stderr, "out of int range\n");
            return 0;
        }
        *value = number;//assign number to pointer

    return 1;//success
}

int main ( void) {
    char line[4096] = "";
    char *parse = line;
    int number = 0;

    fgets ( line, sizeof line, stdin);
    line[strcspn ( line, "\r\n")] = 0; // remove newline

    while ( *parse) {
        if ( 1 == parselint ( parse, &number, &parse)) {
            printf ( "you entered %d\n", number);
        }
    }

    return 0;
}

CodePudding user response:

C makes this very easy, but you need to leverage some library functions. At the most simple:

  • use fgets() and strpbrk() to obtain and verify a line of text
  • use strtok() and strtol() to parse and verify integer values.

What you do with those values is up to you. Following your example prompt, let’s just print them.

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

int error( const char * message, const char * value )
{
  fprintf( stderr, "%s%s\n", message, value );
  return 1;
}

int main()
{
  printf( "Input: " );

  // Get all input on a single line
  char text[1000];
  fgets( text, sizeof(text), stdin );

  // Verify that the entire line of input was obtained
  char * nl = strpbrk( text, "\r\n" );
  if (!nl) return error( "Line too long!", "" );
  *nl = '\0';
  
  puts( "Output:" );
  
  // For each whitespace-delimited (spaces, tabs) token in the line:
  for (char * token = strtok( text, " \t" );  token;  token = strtok( NULL, " \t" ))
  {
    // Attempt to convert it to an integer
    char * nok;
    int n = strtol( token, &nok, 10 );
    if (*nok) return error( "Invalid integer value: ", token );
    
    // Success!
    printf( "You entered %d\n", n );
  }
  
  return 0;
}

Notice also how it is OK to create a little helper function (error()). You can make helpers as complex or simple as you need. For this helper, all we need was to complain with one or two strings and return an “error happened” exit code that main() can pass right to the shell.

  • Related