c语言 - 为什么 scanf 不能解析由 / 标记分隔的输入?

  • 本文关键字:分隔 语言 不能 scanf 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 %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.

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

最新更新