这是我的C代码。 Ticket# Priority
123 Low
1254 Low
5478 Medium
4585 High
etc., etc.,
的{{1}}在for循环中不起作用。即使在循环中,字符串也只需要一个值。如果我将Scanset
的{{1}}替换为scanf()
则可行。如何使这个scanset
循环工作?
scanf()
答案 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
其他方法:
scanf(" %127[^\n]", str);
首先扫描所有领先的空白区并将其抛弃,然后将非'\n'
个字符扫描到str
。这不允许str
中的前导空格。
scanf("%127[^\n]%*c", str);
,则 '\n'
不会读取任何内容。 str
保持不变。重复通话也会出现同样的问题。
scanf(" %[^\n]s", str);
失败了#1。另外:''毫无意义 - 将其删除。