0

I am new trying to learn C programming, I code a little program that read only the integers from an input with both integers and characters but I want to go a little further: I need to add a \n char only the first time a character is read from the input (in this case the standard input but it could be a file). This is the code I can get:

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

#define M 1000

int main(void)
{
    char a;
    char enteros[M];
    int output[M];
    int count = 0;
    int i;
    int x = 0;
    int index = 0;
    int num = 0;
    char *str;

    while (fscanf(stdin, "%c", &a) != EOF)
    {
        enteros[count] = a;
        count++;
    }

    enteros[count] = '\0';
    str = enteros;

    while (*str)
    {
        if (sscanf(str, "%d%n", &num, &x) == 1)
        {
            output[index] = num;
            index++;
        }

        str += x;

        for (; *str; str++)
        {
            if (*str >= '0' && *str <= '9') /* positive value */
                break;
            if (*str == '-' && *(str + 1) >= '0' && *(str + 1) <= '9') /* negative */
                break;
        }
    }

    for (i = 0; i < index; i++)
    {
        printf(" %d", output[i]);
    }

    return 0;
}

When the input is:

1 8 4000 2 -23 end 51 87 end –4
–3 2 end

The output should be:

1 8 4000 2 -23 
51 87 
-4 -3 2

But instead I get:

1 8 4000 2 -23 51 87 4 3 2

Thanks for the help!

javiLPot
  • 25
  • 4
  • 1
    Do note that reading an unbounded number of characters into a fixed sized buffer is [as dangerous as `gets`](https://stackoverflow.com/q/1694036/2505965). Checking for `EOF` is not enough; you must also ensure that `count` never reaches `M` (leave room for the null terminating byte). – Oka Oct 27 '22 at 09:07

1 Answers1

1

Add a flag variable to control when a newline should be printed.
Set the flag when an integer has been scanned and printed.
Reset the flag when a newline is printed.
ctypes.h has isalpha that can be used to detect letters.
For this example the input is hard coded rather than taken from stdin.

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

#define M 1000

int main(void)
{
    char a;
    char enteros[M];
    int output[M];
    int newline = 0;
    int count = 0;
    int i;
    int x = 0;
    int index = 0;
    int num = 0;
    char *str;

    // while (fscanf(stdin, "%c", &a) != EOF)
    // {
        // enteros[count] = a;
        // count++;
    // }
    // enteros[count] = '\0';

    strcpy ( enteros, "1 8 4000 2 -23 end 51 87 end -4 -3 2 end");

    str = enteros;

    while (*str)
    {
        x = 1;
        if (sscanf(str, "%d%n", &num, &x) == 1)
        {
            output[index] = num;
            printf(" %d", output[index]);
            newline = 0;
            index++;
        }

        str += x;

        for (; *str; str++)
        {
            if ( *str == '-' || (*str >= '0' && *str <= '9')) {
                break;
            }
            else if ( ! newline && isalpha ( (unsigned int)*str)) {
                printf ( "\n");
                newline = 1;
            }
        }
    }

    // for (i = 0; i < index; i++)
    // {
        // printf(" %d", output[i]);
    // }
    printf ( "\n");

    return 0;
}
user3121023
  • 8,181
  • 5
  • 18
  • 16