当我学习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;
}
Run Code Online (Sandbox Code Playgroud)
输入和输出如下:
separate day by /
3/Dec/2016
3 Dec/2016 0
separate day by blank
3 Dec 2016
3 Dec 2016
Run Code Online (Sandbox Code Playgroud)
为什么会出现第二个/标记,零个字符也会出现?有没有办法或工具来分析这样的问题?
这是因为你%s在第一个/角色之后得到了所有东西.所以当你%d开始阅读时,什么也没有了.
你可以通过这样做清楚地理解输出:
printf("separate day by /\n");
scanf("%d/%s/%d", &day, monthName, &year);
printf("%d---%s---%d\n", day, monthName, year);
Run Code Online (Sandbox Code Playgroud)
产量:
separate day by /
3/Dec/2016
3---Dec/2016---0
Run Code Online (Sandbox Code Playgroud)
原因scanf是没有/像你期望的那样尊重第二个是因为%s没有停在/那里,它只停留在空白字符上.从文档中检查:
任意数量的非空白字符,在找到的第一个空白字符处停止.在存储序列的末尾自动添加终止空字符.