Scanf坐标直到EOF

时间:2013-11-16 16:43:48

标签: c scanf

我有一个非常有趣的问题。我需要扫描格式为[x,y]的多个坐标,以''分隔,直到出现野EOF为止。然后,我只需要结束while循环并继续执行函数体。我使用while while循环一次扫描1个数字。现在,当我将其更改为一次加载2个数字并修改scanf输入格式以与实际输入相对应时,扫描正常,直到EOF,但不是打破while循环,而是等待另一个输入和不离开循环。并且,如果我尝试添加一些数字,它不会扫描它们。我发现离开循环的唯一方法是放[或[x或[x,输入并按回车,然后它离开循环。如果它成功扫描2个数字,它将不会结束,直到我中断应用程序并关闭它。

while ( !feof(stdin) && (status=scanf("[%lf,%lf]",&x,&y))==2)
{   if (status==EOF)
            break;
    if (status != 2 && status != EOF)
            {printf("Wrong input.\n");
            free (X);
            free (Y);
            return 1;}
    X=(double*) realloc (X ,max * sizeof(*X));
    Y=(double*) realloc (Y ,max * sizeof(*Y));

    if ( X==NULL || Y==NULL)
            {free (X);
            free (Y);
            printf ("Allocation error.\n");
            return 1;}
    else
            {X[max-1]=x;
             Y[max-1]=y;
             max++;} 
    if (status != EOF)
            while (fgetc(stdin)!=' ') {}
}

由于输入错误的含义,我还没有完成这部分代码,但是这个问题让我更加担心。谢谢:))

2 个答案:

答案 0 :(得分:2)

编辑:我误解了这个问题 - 我假设输入是逐行的:

[1.0,2.0]
[3.0,4.0]
...

以下代码接受同一行的输入(或使用换行符,无关紧要)。如果您手动输入,可以使用ctrl-d打破循环。

bash-4.2$ ./a.out 
[1,2][3,4][5,6]
[7,8][9,0]
Values read in: # <--- I pressed ctrl-d on this line
[1.000000,2.000000]
[3.000000,4.000000]
[5.000000,6.000000]
[7.000000,8.000000]
[9.000000,0.000000]

否则,这样的事情也会起作用:

bash-4.2$ echo "[1,2][3,4]" | ./a.out
Values read in:
[1.000000,2.000000]
[3.000000,4.000000]

以下是代码:

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

double * safe_realloc_double(double * ptr, size_t size);

int main()
{
    double x, y, *X = NULL, *Y = NULL;
    int max = 1, i;
    while (scanf(" [ %lf , %lf ]", &x, &y) == 2)
    {        
        X = safe_realloc_double(X, max);
        Y = safe_realloc_double(Y, max);
        if (X == NULL || Y == NULL)
        {
            return 1;
        }
        else
        {
            X[max-1]=x;
            Y[max-1]=y;
            max++;
        } 
    }    
    printf("Values read in:\n");
    for (i = 0; i < max-1; ++i) 
    {
        printf("[%f,%f]\n", X[i], Y[i]);
    }
    free(X);
    free(Y);
    return 0;
}

double * safe_realloc_double(double * ptr, size_t size)
{
    double * p = realloc(ptr, size * sizeof (double));
    if (p == NULL) 
    {
        printf("Allocation error.\n");
        free(ptr);
    }
    return p;
}

旧答案

您可以使用fgets逐行读取您的输入。

我是这样做的:

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

#define BUF_SIZE 1024

double * safe_realloc_double(double * ptr, size_t size);

int main()
{
    double x, y;
    double *X = NULL, *Y = NULL;
    int max = 1, status, i;
    char buffer[BUF_SIZE];
    while (fgets(buffer, BUF_SIZE, stdin) != NULL)        
    {        
        status = sscanf(buffer, "[%lf,%lf]", &x, &y);
        if (status != 2)
        {
            printf("Wrong input.\n");
            free(X);
            free(Y);
            return 1;
        }
        X = safe_realloc_double(X, max);
        Y = safe_realloc_double(Y, max);
        if (X == NULL || Y == NULL)
        {
            return 1;
        }
        else
        {
            X[max-1]=x;
            Y[max-1]=y;
            max++;
        } 
    }    
    printf("Values read in:\n");
    for (i = 0; i < max-1; ++i) 
    {
        printf("[%f,%f]\n", X[i], Y[i]);
    }
    return 0;
}

double * safe_realloc_double(double * ptr, size_t size)
{
    double * p = realloc(ptr, size * sizeof *ptr);
    if (p == NULL) 
    {
        printf("Allocation error.\n");
        free(ptr);
    }
    return p;
}

答案 1 :(得分:1)

您的问题是由

引起的
if (status != EOF)
        while (fgetc(stdin)!=' ') {}

我会在

行上使用一些东西
#include <stdio.h>

int main()
{
    int status;
    double x, y;
    while (!feof(stdin) && (status = scanf(" [ %lf , %lf ]", &x, &y)) == 2) {
        printf("%f:%f\n", x, y);
    }
    return 0;
}

看到格式字符串中的空格,它们会在输入的那个地方吃掉所有输入的空格而不强制要有一些。

请注意,习惯上以几何级数(因子1.5和2是常见的)重新分配,以避免二次行为。