我一直在研究一个程序,该程序读取一个字符串,该字符串是日期和时间,格式如下dd-yy-aaaa hh:mm:ss。它执行n次,最后它打印以正确格式输入的字符串数。我无法让它只计算具有例如四位数格式的年份的日期。只要输入的数据是数字,它就会计数。我如何解决它? 这是我的代码
#include <stdio.h>
int main(){
char string[100];
int day[10];
int month[10];
int year[10];
int hour[10];
int minute[10];
int second[10];
int n,i=0;
scanf("%d",&n);
fflush(stdin);
while(n!=0){
scanf("%[^\n]s", &string);
fflush(stdin);
if((sscanf(string,"%d%d-%d%d-%d%d%d%d %d%d:%d%d:%d%d",day,month,year,hour,minute,second))==6){
i++;
}
n--;
}
printf("%d",i);
}
答案 0 :(得分:2)
如果使用strptime
,即使用
从联系手册:
NAME
strptime - convert a string representation of time to a time tm structure
概要
#define _XOPEN_SOURCE /* See feature_test_macros(7) */ #include <time.h> char *strptime(const char *s, const char *format, struct tm *tm);
说明
strptime()
函数是strftime
(3)的逆函数,并将s
指向的字符串转换为 使用tm
指定的格式存储在format
指向的tm结构中的值。这里format
是一个 由字段描述符和文本字符组成的字符串,让人联想到scanf(3)
。每个字段描述符由一个%
字符后跟另一个字符组成,该字符指定字段描述符的替换。 格式字符串中的所有其他字符必须在输入字符串中具有匹配的字符,但空格除外, 它匹配输入字符串中的零个或多个空白字符。任何两个字段描述符之间应该有空格或其他字母数字字符。
所以它继续......
答案 1 :(得分:1)
要澄清一些注意事项:
为什么day
等长度为10的数组?您是否期望n <= 10
并保存每个日期?
您需要return
声明。
i
应该是成功解析日期的数量吗?
好的,所以你使用sscanf
的方式存在一些问题(但是要检查返回值!) - 这是specification。
sscanf
必须包含您想要阅读输入的地址 - 因此&day[i]
可能会显示。
%d
会读取整个int
,而不只是一位数 - 也就是说,
sscanf(string, "%d", &my_int_var);
会读取它遇到的第一个int
,无论是1,10,1987,2008,88等。
答案 2 :(得分:1)
e.g。修复
char string[100];
int day;
int month;
int year;
int hour;
int minute;
int second;
int n,i=0;
scanf("%d", &n);
fflush(stdin);//non-portable
while(n>0){
scanf(" %99[^\n]", &string);
fflush(stdin);
if((sscanf(string,"%2d-%2d-%4d %2d:%2d:%2d", &day,&month,&year,&hour,&minute,&second))==6){
//range check
++i;
}
--n;
}
printf("%d", i);
答案 3 :(得分:0)
使用fgets()
读取数据,然后使用sscanf()
功能进行解析:
"%*1d%*1d"
检测2位数字,
"%*1[ ]"
检测空间
"%n"
表示正确的长度和结尾。
// 1 good, 0 bad
int CheckDate(const char *buffer) {
static const char format[] = "dd-yy-aaaa hh:mm:ss\n";
#define Space "%*1[ ]"
#define Dig2 "%*1d%*1d"
#define Dig4 Dig2 Dig2
int n = 0;
sscanf(buffer, Dig2 "-" Dig2 "-" Dig4 Space Dig2 ":" Dig2 ":" Dig2 "%n", &n);
return (sizeof(format) - 2 == n) && (buffer[n] == '\n');
}
int main() {
int i = 0;
int n = 0;
scanf("%d%*c", &n);
while (n-- > 0) {
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) == NULL) break; // EOF
i += CheckDate(buffer);
}
printf("%d",i);
return 0;
}