2013-06-12 30 views
1

我有一台Linux机器。读标准输入以块...(可能与scanf函数?)

在此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); 

正如你可能已经猜到了,标准输入包含我需要的“&”字符划定的数据。

正如我希望有人更熟练比我已经猜到了,输出看起来是这样的:

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函数应该消耗标准输入它已经读的一部分。为什么不这样做?

此外,供参考:这是被一个很便宜的,慢的服务器上运行。体积可能会或可能不会超过轻微。效率是这样一个加号,我接受但有人可能会认为我这样做....

谢谢!

回答

0

的问题是,在第二次迭代scanf函数不能读你给它(线路从标准输入读取不匹配),而不会修改PROC格式。这也是它返回0的原因:它已经成功读取(并因此修改)了0个字段。

2

该scanset不需要两个单引号 - 如果你想打破单引号就足够了,但我怀疑你只想在&停下来,下面的代码也假设了这一点。一旦你读到第一个&,你需要一些代码来阅读&。在使用返回的数据之前,您需要检查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;移动到循环顶部

+0

“scanf()”的格式指定它应该分配给两个参数,但只传递一个参数。这是从提问者的原始代码传播出来的错误。 – jxh

+0

@jxh:谢谢;我应该编写代码 - drat! –

+0

谢谢,这确实清除了它! – user1833028