我有一个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部分。为什么不这样做?
另外,仅供参考:这是在一个非常便宜,慢的服务器上运行。体积可能会或可能不会变得轻微。因此,效率是一个加分,我愿意,但有人可能会建议我这样做....
谢谢!
答案 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个字段。