c - scanf问题

anp*_*anp 1 c scanf delimiter

所以我在格式化scanf调用时遇到了一些麻烦以适应我的输入.基本上,我想输入一个字符串(最多32个字符)和2个整数(全部用空格分隔).目前,我的代码是:

scanf("%32s", str);
scanf("%*s %d %d", &first, &last);
Run Code Online (Sandbox Code Playgroud)

我添加了%*s以便在32 I读入后忽略任何可能的字符.由于某种原因,这个%*s忽略第一个数字并从输入读取第二个数字到&last.我不确定如何解决这个问题,任何帮助将不胜感激.

use*_*738 5

如果你想丢弃一定数量的字符(我的答案中有4个字符),你可以这样做:

scanf("%*4s %d %d", &first, &last);
Run Code Online (Sandbox Code Playgroud)

但是较早的一个是丢弃它看到的每一个角色,它没有停止并消耗你的int的数字.

在这种情况下,我显示的东西将消耗4个字符,然后读取int-s.

用法示例:

>54321 12
Run Code Online (Sandbox Code Playgroud)

这将需要在firstlast 112分别.并检查scanf此处的返回值- 这将是2呼叫成功的情况.扩展这个想法,你会做到这一点

scanf("%*32[^ \n] %d %d", &first, &last);
Run Code Online (Sandbox Code Playgroud)

如果它们不是来自扫描集[^ \n],那么你将跳过前32个字符,然后用%d格式说明符输入其余部分以获得输入整数.

如果要跳过第一个空格之前的任何字符,则可以执行此操作

scanf("%*[^ \n] %d %d", &first, &last);
Run Code Online (Sandbox Code Playgroud)

这与前一个完全相同,唯一的区别是此处没有像之前一样的32个字符的限制.

在所有这些情况下,必须检查返回值scanf- 需要该级别的错误检查.

最好是使用它fgets来更好地控制输入.拿整行,然后使用strtol等解析它.

我将添加评论(Jonathan Leffler):

请注意,%*4s将跳过零个或多个空格字符,然后读取4非空白字符,并在下一个空格处或4读取字符时停止.以下空白会跳过零个或多个空格.它%d还会跳过零个或多个空格字符,然后读取整数(或失败).(重复第二个空格和%d.)如果要4无条件地跳过字符,请使用%*4c,之后可能使用空白,%因为%c不会跳过空格.(" %*4c").

David C. Rankin提到的另一个选择是使用扫描集,其中提到的数字被忽略.scanf("%*[^0-9]%d %d",&first,&last)将跳过所有字符,直到找到一个数字.