大块读Stdin ......(可能用scanf?)

时间:2013-06-12 20:45:20

标签: c linux cgi scanf

我有一个linux盒子。

在这个linux框中,有一个程序。

在这个程序中,我有一个这样的循环:

int num=*"what num needs to be"*;
char proc[num];

int result;
while (1) {
result=scanf("%[^'&']%s",proc);
printf("And proc is: %s\n",proc);
printf("Result counter was: %i\n",result)
if (result == 0) break;
}

scanf("%[^'&'],%s",proc)
printf("post lop result is: %s", proc);

正如您可能已经猜到的那样,stdin包含我需要的'&'所描述的数据。字符。

因为我希望比我更熟练的人猜测,输出看起来像是:

And proc is: *first delineated section*
Result counter was: 1
And proc is: *first delineated section*
Result counter was: 0
post loop result is: *first delineated section*

我认为scanf应该消耗它已读过的stdin部分。为什么不这样做?

另外,仅供参考:这是在一个非常便宜,慢的服务器上运行。体积可能会或可能不会变得轻微。因此,效率是一个加分,我愿意,但有人可能会建议我这样做....

谢谢!

2 个答案:

答案 0 :(得分:2)

扫描集中不需要两个单引号 - 如果你想打破一个引号就足够了,但我怀疑你只想停在&上,下面的代码也假设了。阅读完第一个&后,您需要一些代码才能阅读&。在使用它返回的数据之前,您需要检查scanf()的结果。

因此:

int num = 100;
char proc[num];

int result;
while ((result = scanf("%99[^&]", proc)) == 1)
{
    printf("And proc is: <<%s>>\n", proc);
    printf("Result counter was: %i\n", result);
    int c;
    while ((c = getchar()) != EOF && c != '&')
        ;
}

您还需要确定换行符是否也标记了字段的结尾...如果有,则:

int num = 100;
char proc[num];

int result;
while ((result = scanf("%99[^&\n]", proc)) == 1)
{
    printf("And proc is: <<%s>>\n", proc);
    printf("Result counter was: %i\n", result);
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c != '&' && c != '\n')
        {
            ungetc(c, stdin);
            break;
        }
    }
}

请注意使用%99[...]来防止缓冲区溢出。尖括号<<%s>>只标记字符串的开头和结尾;例如,它们可以显示尾随空格和标签。

代码假设您有一个C99编译器,它允许在代码块中途进行变量声明。如果没有,请将int c;移至循环顶部

答案 1 :(得分:0)

问题是在第二次迭代中,scanf无法读取您给出的格式(从标准输入读取的行不匹配)并且不会修改proc。这也是它返回0的原因:它已成功读取(并因此修改)了0个字段。