获取正确的 sscanf 格式以打印字符串和整数
Getting the correct sscanf format to print a string and integers
如果我希望 print 语句的输出为:Saturday March 25 1989
,那么 sscanf
参数应该是什么样子的?
换句话说,我希望 date
包含 Saturday
和 March
。我尝试了不同的 sscanf
格式选项,但打印语句通常会出现乱码。
int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %d %d", date, &day, &year );
printf("%s %d %d\n", date, day, year );
in sscanf
%s
将仅获得 Saturday 因为 space 然后 %d
将尝试提取 int
3 月 当然不能
但你可以这样做:
sscanf( dtm, "%[^0-9] %d %d", date, &day, &year );
或更好
sscanf( dtm, "%49[^0-9] %d %d", date, &day, &year );
不要冒险写出 date(49 而不是 50 让 space 作为结束空字符)。
所以
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
if (sscanf( dtm, "%49[^0-9]%d%d", date, &day, &year ) == 3) /* remove useless spaces in format */
printf("'%s' %d %d\n", date, day, year ); /* use '%s' to show all from date */
return 0;
}
编译执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
如您所见,日期会记住 space 日期之后的天数,在您的情况下无法避免这种情况,因为日期的长度是可变的,但您可以使用 sscanf( dtm, " %[^0-9]%d%d", date, &day, &year );
绕过可能的 spaces before :
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, " Saturday March 25 1989" );
if (sscanf( dtm, " %49[^0-9]%d%d", date, &day, &year ) == 3)
printf("'%s' %d %d\n", date, day, year );
return 0;
}
编译与执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
其中 dtm 没用,你可以直接做:
if (sscanf(" Saturday March 25 1989",
" %49[^0-9]%d%d", date, &day, &year ) == 3)
如果我希望 print 语句的输出为:Saturday March 25 1989
sscanf
参数应该是什么样子的?
换句话说,我希望 date
包含 Saturday
和 March
。我尝试了不同的 sscanf
格式选项,但打印语句通常会出现乱码。
int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %d %d", date, &day, &year );
printf("%s %d %d\n", date, day, year );
in sscanf
%s
将仅获得 Saturday 因为 space 然后 %d
将尝试提取 int
3 月 当然不能
但你可以这样做:
sscanf( dtm, "%[^0-9] %d %d", date, &day, &year );
或更好
sscanf( dtm, "%49[^0-9] %d %d", date, &day, &year );
不要冒险写出 date(49 而不是 50 让 space 作为结束空字符)。
所以
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
if (sscanf( dtm, "%49[^0-9]%d%d", date, &day, &year ) == 3) /* remove useless spaces in format */
printf("'%s' %d %d\n", date, day, year ); /* use '%s' to show all from date */
return 0;
}
编译执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
如您所见,日期会记住 space 日期之后的天数,在您的情况下无法避免这种情况,因为日期的长度是可变的,但您可以使用 sscanf( dtm, " %[^0-9]%d%d", date, &day, &year );
绕过可能的 spaces before :
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, " Saturday March 25 1989" );
if (sscanf( dtm, " %49[^0-9]%d%d", date, &day, &year ) == 3)
printf("'%s' %d %d\n", date, day, year );
return 0;
}
编译与执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
其中 dtm 没用,你可以直接做:
if (sscanf(" Saturday March 25 1989",
" %49[^0-9]%d%d", date, &day, &year ) == 3)