我有一个非常有趣的问题。我需要扫描格式为[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)!=' ') {}
}
由于输入错误的含义,我还没有完成这部分代码,但是这个问题让我更加担心。谢谢:))
答案 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是常见的)重新分配,以避免二次行为。