Как получить ввод с помощью предшествующих символов? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь использовать scanf() для этого конкретного c типа ввода. Введены следующие данные:

n = 2
m = 3

Я понимаю, что scanf("%d %d", &n, &m); не будет работать из-за наличия «n =» и «m =», не следует ли мне использовать scanf()? или это можно сделать с помощью какого-то регулярного выражения или чего-то еще?

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Если форма вашего ввода:

<name><zero or more spaces>=<zero or more spcaes><number>
<name><zero or more spaces>=<zero or more spcaes><number>

, вы можете прочитать часть <name> без сохранения, используя %* и используя [^=], чтобы продолжить чтение, пока '=' не будет найдено.

Это может выглядеть так:

int main(void) {
    int n,m;
    if (scanf("%*[^=] = %d %*[^=] = %d", &n, &m) != 2) 
    {
        printf("bad input\n");
    }
    else
    {
        printf("Now n is %d and m is %d\n", n, m);
    }
    return 0;
}

Он будет обрабатывать ввод как:

n = 2
m = 3

и

nnnnnn                   =20
mmmmmmm =           100

и

n = 2
m=3

и даже однострочный ввод, например:

n      =              2037  m=3733
1 голос
/ 06 августа 2020

Один из способов - сначала поймать их как строки (лучше использовать fgets() для этого, чем scanf()):

char buf_a[30];
char buf_b[30];

fgets(buf_a, sizeof(buf_a), stdin);
fgets(buf_b, sizeof(buf_b), stdin);

, а затем проанализировать входные строки:

sscanf(buf_a, "n = %d", &n);
sscanf(buf_b, "m = %d", &m);
#include <stdio.h>

int main (void)
{
    char buf_a[30];
    char buf_b[30];

    int n = 0, m = 0;

    while (1)
    {
        if ( !fgets(buf_a, sizeof(buf_a), stdin) ||
             !fgets(buf_b, sizeof(buf_b), stdin) )
        {
            // error routine.
        }

        if ( sscanf(buf_a, "n = %d", &n) &&
             sscanf(buf_b, "m = %d", &m) )
            break;

        printf("Invalid input! Please repeat your input.\n");
    }

    printf("%d\n", n);
    printf("%d", m);
}

Исполнение:

./a.out
n = 5
m = 4
5
4
...