如何使scanf()的Negated scanset在循环中工作?

时间:2015-09-20 12:31:17

标签: c

这是我的C代码。 Ticket# Priority 123 Low 1254 Low 5478 Medium 4585 High etc., etc., 的{​​{1}}在for循环中不起作用。即使在循环中,字符串也只需要一个值。如果我将Scanset的{​​{1}}替换为scanf()则可行。如何使这个scanset循环工作?

scanf()

1 个答案:

答案 0 :(得分:3)

尝试此测验:用户类型 A B C 输入,代码为

scanf("%[AB]", buf1);
scanf("%[AB]", buf2);

buf1的内容是什么? 什么进入buf2

scanf("%[AB]", buf1); - > "AB"存储在buf1中,返回1表示已成功扫描1个字段。 scanf("%[AB]", buf2); - > buf2保持不变,没有任何内容,'C''\n'保留在stdin。返回值0表示无法保存数据,但有些内容位于stdin

同样的事情发生在 D E F 输入 G H I 输入

scanf("%[^\n]", buf3);
scanf("%[^\n]", buf4);

"DEF"存储在buf3中。但buf4保持不变,其中没有任何内容,'\n''G''H''I''\n'仍保留在stdin }。

OP代码失败,因为'\n'永远不会使用scanf("%[^\n]s", str);

最接近的一般方法是

*str = 0;  // Terminate s in case only \n entered
if (scanf("%127[^\n]", str) != 1) Handle_EOF();
scanf("%1*[\n]"); // consume next character if it is a \n

使用否定扫描集或任何扫描集来读取糟糕的通用解决方案中的行 请改用fgets()getline()(* nix)。

fgets(str, sizeof str, stdin);
str[strcspn(str, "\n")] = 0; // To lop off a potential trailing \n

其他方法:

  1. scanf(" %127[^\n]", str);首先扫描所有领先的空白区并将其抛弃,然后将非'\n'个字符扫描到str。这不允许str中的前导空格。

  2. 如果第一个字符为scanf("%127[^\n]%*c", str);,则
  3. '\n'不会读取任何内容。 str保持不变。重复通话也会出现同样的问题。

  4. scanf(" %[^\n]s", str);失败了#1。另外:''毫无意义 - 将其删除。