C - Заполнение массива из определенного однострочного ввода - PullRequest
0 голосов
/ 24 ноября 2018

Я новичок, и для моего школьного упражнения по программированию мне нужно составить целочисленный массив из указанного ввода.Входные данные выглядят так:

1000: {250, 500, 750} (введите)

Мой базовый код способен сканировать только числа, разделенные пробелами.

#include <stdio.h>
#include <stdlib.h>
#define LEN 10
long int array[LEN];

    int main()
    {   
        long int i;

        for (i =0; i < LEN; i++)
            {
            scanf("%li", &array[i]);
            }

    return 0;
    }

У меня есть статический массив, и мне нужно заполнить его числами в {} скобках.Число перед символом ":" (в данном случае 1000) я мог сканировать как одну переменную или как 0-й элемент массива.Могу ли я использовать какой-нибудь модифицированный scanf?Но я думаю, что здесь есть какой-то цикл с scanf.Иногда массив больше, чем заданные числа, поэтому мне нужно завершить цикл символом "}".Спасибо за идеи.

1 Ответ

0 голосов
/ 25 ноября 2018

Попробуйте использовать fgets для чтения строки.Разобрать строку с sscanf.Спецификатор %n сообщит о количестве символов, обработанных при сканировании.Накопление этих значений позволит выполнить итерацию по линии.

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

#define SIZE 4000
#define LIMIT 500

int main( void) {
    char line[SIZE] = "";
    char bracket = 0;
    long int value[LIMIT] = { 0};
    int result = 0;
    int input = 0;
    int offset = 0;
    int span = 0;

    printf ( "enter values x:{w,y,...,z}\n");
    if ( fgets ( line, sizeof line, stdin)) {
        //scan for long int, optional whitespace, a colon,
        //optional whitespace, a left brace and a long int
        if ( 2 == ( result = sscanf ( line, "%ld : {%ld%n", &value[0], &value[1], &offset))) {
            input = 1;
            do {
                input++;
                if ( LIMIT <= input) {
                    break;
                }
                //scan for optional whitespace, a comma and a long int
                //the scan will fail when it gets to the right brace }
                result = sscanf ( line + offset, " ,%ld%n", &value[input], &span);
                offset += span;//accumulate processed characters
            } while ( 1 == result);
            //scan for optional space and character ie closing }
            sscanf ( line + offset, " %c", &bracket);
            if ( '}' != bracket) {
                input = 0;
                printf ( "line was not terminated with }\n");
            }
        }
    }
    else {
        fprintf ( stderr, "fgets EOF\n");
        return 0;
    }

    for ( int each = 0; each < input; ++each) {
        printf ( "value[%d] %ld\n", each, value[each]);
    }

    return 0;
}
...