这是我
学习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 %dn", day, monthName, year);
printf("separate day by blankn");
scanf("%d%s%d", &day, monthName, &year);
printf("%d %s %dn", 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
为什么会出现第二个/标记,而零字符也会出现?有没有办法或工具来分析这个问题?
这是因为您的%s
在第一个/
字符之后获取所有内容。因此,当您的%d
开始阅读时,什么都没有了。
通过这样做,您可以清楚地了解该输出:
printf("separate day by /n");
scanf("%d/%s/%d", &day, monthName, &year);
printf("%d---%s---%dn", day, monthName, year);
这会产生:
separate day by /
3/Dec/2016
3---Dec/2016---0
scanf
没有像您期望的那样尊重第二个/
的原因是%s
它不会停止在/
,它只在空格字符上停止。从文档中检查以下内容:
任意数量的非空格字符,在第一个停止 找到空格字符。终止空字符为 自动添加到存储序列的末尾。
您需要将格式字符更改为%[...]
以指定接受的字符,而不是%s
使用的默认值。
您还需要指定缓冲区大小以防止缓冲区溢出。
用:
"%d/%19[^/]/%d"
或者只是使用strptime
.
- 好吧,
scanf()
可以处理用斜杠('/')分隔的字段的输入。只是不适用于字符串(这在您的情况下很不幸)。 - 您看到的情况是因为您对字符串使用了无效的分隔符(斜杠)。
scanf()
只接受空格(空格、制表符、换行符)作为字符串的分隔符。这是因为一个字符串可能包含许多不同的字符(当然你可能会问为什么一个有效的字符串不应该包含空格......好吧,创作者必须选择一些角色。许多初级程序员在无法获得带有空格的字符串时偶然发现了这一点scanf()
...... - 对于数值类型,
scanf()
中可以使用更广泛的分隔符。您可以使用所有非法表示数字的字符作为分隔符(整数和实数的有效字符集的确切集合不同)。