为什么scanf无法用/ mark分隔输入?

时间:2016-05-28 04:25:07

标签: c scanf

当我学习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

为什么会显示第二个/标记,零个字符也会出现?有没有办法或工具来分析这样的问题?

3 个答案:

答案 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)

  1. 好吧,scanf() 可以使用以斜杠(&#39; /&#39;)分隔的字段处理输入。只是不是字符串(这在你的情况下很不幸)。
  2. 您看到的是因为您对字符串使用了无效的分隔符(斜杠)。 scanf()只接受空格(空格,制表符,换行符)作为字符串的分隔符。这是因为一个字符串可能包含许多不同的字符(当然你可能会问为什么一个有效的字符串不应该包含空格......好吧,创建者必须选择一些字符许多初学程序员在遇到带有scanf()空格的字符串时偶然发现了这个...)
  3. 对于数字类型,scanf()中可以使用更广泛的分隔符。您可以将所有用于表示数字的字符用作分隔符(整数和实数的确切有效字符集不同)。