C++中sscanf

简介: sscanf

微信截图_20220414133631.png

#include<bits/stdc++.h>
using namespace std;
void test01(){
  char *str="123456abcde";
  char buff[1024]={0};
  sscanf(str,"%*d%s",buff);
  printf("buf:%s\n",buff);
} 
void test011(){
  char *str="abcde123456";
  char buff[1024]={0};
  sscanf(str,"%*d%s",buff);
  printf("buf:%s\n",buff);
} 
void test02(){
  char *str="123456abcd";
  char buf[1024]={0};
  sscanf(str,"%7s",buf);
  printf("buf:%s\n",buf);
}
void test03(){
  char *str="123456abcd";
  char buf[1024]={0};
  sscanf(str,"%[a-z]",buf);
  printf("buf:%s\n",buf);
}
void test031(){
  char *str="abcd123456";
  char buf[1024]={0};
  sscanf(str,"%[a-z]",buf);
  printf("buf:%s\n",buf);
}
void test04(){
  char *str="abcdAbe123456";
  char buf[1024]={0};
  sscanf(str,"%[Ab]",buf);
  printf("buf:%s\n",buf);
}
void test05(){
  char *str="abcdAbe123456";
  char buf[1024]={0};
  sscanf(str,"%[^e]",buf);
  printf("buf:%s\n",buf);
}
void test06(){
  char *str="abcdAbe123456";
  char buf[1024]={0};
  sscanf(str,"%[^b-z]",buf);
  printf("buf:%s\n",buf);
}
void test07(){
  char *ip="127.0.0.1";
  int a,b,c,d;
  sscanf(ip,"%d.%d.%d.%d\n",&a,&b,&c,&d);
  printf("%d %d %d %d\n",a,b,c,d);
}
void test08(){
  char *a="abcdeghr#$%%";
  char b[1024];
  sscanf(a,"%*9s%s",b);
  printf("b:%s\n",b);
}
void test09(){
  char *a="abcde#fghgfg@44";
  char b[1024];
  sscanf(a,"%*[^#]#%[^@]",b);
  printf("b:%s\n",b);
}
int main(){
  test01();
  test011();
  test02();
  test03();
  test031();
  test04();
  test05();
  test06();
  test07();
  test08();
  test09();
  return 0;
}

例题


题目描述


小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。


小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京和美国东部有12小时时差,故飞机总共需要14小时的飞行时间。


不久后小h的女朋友去中东交换。小h并不知道中东与北京的时差。但是小h得到了女朋友来回航班的起降时间。小h想知道女朋友的航班飞行时间是多少。


对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相同,求飞机的飞行时间。


输入


从标准输入读入数据。


一个输入包含多组数据。


输入第一行为一个正整数T,表示输入数据组数。


每组数据包含两行,第一行为去程的 起降 时间,第二行为回程的 起降 时间。


起降时间的格式如下


h1:m1:s1 h2:m2:s2

h1:m1:s1 h3:m3:s3 (+1)

h1:m1:s1 h4:m4:s4 (+2)

表示该航班在当地时间h1时m1分s1秒起飞,


第一种格式表示在当地时间 当日 h2时m2分s2秒降落


第二种格式表示在当地时间 次日 h3时m3分s3秒降落。


第三种格式表示在当地时间 第三天 h4时m4分s4秒降落。


对于此题目中的所有以 h:m:s 形式给出的时间, 保证 ( 0<=h<=23, 0<=m,s<=59 ).


输出


输出到标准输出。


对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。


注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为03:04:05。


样例输入


3

17:48:19 21:57:24

11:05:18 15:14:23

17:21:07 00:31:46 (+1)

23:02:41 16:13:20 (+1)

10:19:19 20:41:24

22:19:04 16:41:09 (+1)

样例输出


04:09:05

12:10:39

14:22:05

首先先学习游戏getline的用法


getline相比于cin的优势在于可以读取table和空格(可以忽略回车)


#include<iostream>

#include<string>

using namespace std;

int main(){

   string str;

   while(getline(cin,str)){

       cout<<str;

   }

 

   return 0;

}

本题最大的难度在输入


sscanf(用法)


c_str()用法


下面是借鉴来的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int get_second(int h, int m, int s){
    return h * 3600 + m * 60 + s;
}
int get_time(){
    string line;
    getline(cin, line); //同样忽略输入的回车
    if(line.back() != ')') line += " (+0)";
    int h1, m1, s1, h2, m2, s2, d;
    sscanf(line.c_str(), "%d:%d:%d %d:%d:%d (+%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);
    return get_second(h2, m2, s2) - get_second(h1, m1, s1) + d * 24 * 3600;
}
int main(){
    int t;
    scanf("%d", &t);
    string line;
   // getline(cin, line); //忽略掉第一行的回车,因为scanf是不读入回车的
    getchar();//读入回车,不知道为什么,读就对了 
    while(t--){
        int time = (get_time() + get_time()) / 2;//去的时间 = 飞行时间 - 时差。回来的时间 =飞行时间 时间 + 时差。去加上回来就减掉,去的时候减去时差回来就加上。所以实际飞行时间= (去的时间 + 回来的时间) / 2
        int hour = time / 3600, minute = time % 3600 / 60, second = time % 60;
        printf("%02d:%02d:%02d\n", hour, minute, second);
    }
    return 0;
}


相关文章
|
8月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
142 1
|
7月前
|
C语言
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
91 1
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
63 0
|
8月前
|
C语言
深入理解字符串函数和字符函数(islower和isupper、tolower和toupper、strlen、strcpy、strcat、strcmp)(一)
深入理解字符串函数和字符函数(islower和isupper、tolower和toupper、strlen、strcpy、strcat、strcmp)(一)
|
算法 C语言
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
该库函数作用和strcpy很相似,不同点在于
84 0
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
|
编译器 Linux C语言
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
193 0
strcat与strncat的实现与比较
strcat与strncat的实现与比较
89 0
strcmp与strncmp的实现和比较
strcmp与strncmp的实现和比较
117 0
|
C语言
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍
|
编译器 C++
文件操作以及相关的函数,fputc,fgetc,fputs,fgtes,fprintf,fscanf,sprintf,sscanf
🐰文件操作 🌸打开文件 🏡文件的顺序读写 🌸fputc字符输入函数(适合所有输入流) 🌸fgetc(适合所有的输出流) 🌸fputs(适合所有的输入流) 🌸fgets(适合所有的输出流) 🏡格式化的读写 🌸fprintf(适合所有的输入流) 🌸fscanf读取文件(适合所有的输出流) 🏡流 🌸屏幕这个流(stdout)输出 🏡对比:printf/fprintf/sprintf和scanf/fscanf/sscanf 🌸sprintf(把格式化数据转换成字符串) 🌸sscanf(把字符串转换成相应格式化数据)