Scanf while loop влияет на следующее сканирование вне цикла - PullRequest
1 голос
/ 19 октября 2019

Мой тестовый ввод

[1,2,3]
[4,5,6]
[7,8,9]
[9,9]

Или это может быть любое количество 3d-координат перед одиночной 2d-координатой, мой код будет

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


int main(){
    int x1;
    int y1;
    int z1;
    int x2;
    int y2;


    while(scanf("[%d,%d,%d]\n", &x1,&y1,&z1) == 3){
        printf("(x,y,z) --->  (%d,%d,%d)\n", x1,y1,z1);
    }



    scanf("[%d,%d]", &x2, &y2);
    printf("(%d,%d)\n", x2, y2);

    return 0;
}

Если я изменю цикл while натогда три отдельных scanfs работают нормально, но проблема в том, что я не знаю, сколько мне понадобится. Можно ли как-то это исправить, чтобы отсканировать 2d координату?

Любая помощь будет очень признательна

1 Ответ

1 голос
/ 19 октября 2019

Попробуйте использовать fgets для захвата ввода. sscanf - это одно из средств анализа входных данных.
Преимущество заключается в том, что входные данные могут быть проанализированы несколько раз, а входной поток очищен до завершающего перевода строки.

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

int main ( void){
    char line[256] = "";
    int x1;
    int y1;
    int z1;
    int x2;
    int y2;

    while( fgets ( line, sizeof line, stdin)) {
        if ( 3 == sscanf ( line, "[%d,%d,%d]", &x1, &y1, &z1)) {
            printf ( "(x,y,z) --->  (%d,%d,%d)\n", x1,y1,z1);
        }
        else if ( 2 == sscanf ( line, "[%d,%d]", &x2, &y2)) {
            printf ( "(x,y) --->  (%d,%d)\n", x2, y2);
            break;//exit the while loop
        }
        else {
            printf ( "input coordinates [x,y,z] or [x,y]\n");
            printf ( "try again\n");
        }
    }
...