当我学习scanf功能时,这是我的程序:
#include <stdio.h>
int main(int argc, char *argv[]) {
int day, year;
char monthName[20];
printf("separate day by /\n");
scanf("%d/%s/%d", &day, monthName, &year);
printf("%d %s %d\n", day, monthName, year);
printf("separate day by blank\n");
scanf("%d%s%d", &day, monthName, &year);
printf("%d %s %d\n", day, monthName, year);
return 0;
}
输入和输出如下:
separate day by /
3/Dec/2016
3 Dec/2016 0
separate day by blank
3 Dec 2016
3 Dec 2016
为什么会显示第二个/标记,零个字符也会出现?有没有办法或工具来分析这样的问题?
答案 0 :(得分:6)
这是因为您的%s
获得了第一个/
字符后的所有内容。因此,当您的%d
开始阅读时,一切都没有了。
你可以通过这样做清楚地理解输出:
printf("separate day by /\n");
scanf("%d/%s/%d", &day, monthName, &year);
printf("%d---%s---%d\n", day, monthName, year);
哪个收益率:
separate day by /
3/Dec/2016
3---Dec/2016---0
scanf
不符合您预期的第二个/
的原因是因为%s
没有停留在/
,它仅停留在空格字符上。请从docs:
任意数量的非空白字符,在第一个字符处停止 发现空白角色。终止空字符是 在存储序列的末尾自动添加。
答案 1 :(得分:1)
您需要将格式字符更改为%[...]
以指定接受的字符数,而不是%s
使用的默认字符。
您还需要指定缓冲区大小以防止缓冲区溢出。
使用:
"%d/%19[^/]/%d"
或只使用strptime
。
答案 2 :(得分:1)
scanf()
可以使用以斜杠(&#39; /&#39;)分隔的字段处理输入。只是不是字符串(这在你的情况下很不幸)。scanf()
只接受空格(空格,制表符,换行符)作为字符串的分隔符。这是因为一个字符串可能包含许多不同的字符(当然你可能会问为什么一个有效的字符串不应该包含空格......好吧,创建者必须选择一些字符许多初学程序员在遇到带有scanf()
空格的字符串时偶然发现了这个...)scanf()
中可以使用更广泛的分隔符。您可以将所有用于表示数字的字符用作分隔符(整数和实数的确切有效字符集不同)。