机试常用算法和题型-输入和输出专题

输入输出专题

控制小数点后精度位数及补齐整数位数

#include <cstdio>
#include <cstdlib>

int main(){
  int n=9;
  double pi=3.1415926;
  printf("%02d\n",n); //保存两位然后补齐,输出09
  printf("0.3f\n",pi); //小数保留三位,输出3.142
  return 0;
}

scanf输入规则

//输入字符
char c;
scanf("%c",&c);

//输入字符串
char a[26],b[10];
scanf("%s%s",a,&b);

//不同整型输出
    short a = 10;
    int b = 100;
    long c = 9437;
    printf("a=%hd, b=%d, c=%ld\n", a, b, c);
    
# include <stdio.h>
int main(void)
{
    char str1[10], str2[10], str3[10];
    printf("请输入字符串:");
    scanf("%s%s%s", str1, str2, str3);
    printf("输出结果:%s %s %s\n", str1, str2, str3);  //%s间要加空格
    return 0;
}
//需要注意的是,前面讲“清空缓冲区”的时候讲过,用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区,这里也不例外。输入字符串时最后“敲”的回车也会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 '\n' 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区。

其他输入规则,getchar(),cin,get(),gets()如何终止循环输入跳出

string str;
while(cin>>str){
  char ch=getchar();
  if(ch=='\n') break;
}

//另一种强悍输入,每一次可以读两个东西
while((cin>>word).get(c)&&flag){
  if(c=='\n'){
    flag==false;
  }
        for (int i = 0; i < word.size(); i++)
        {
            count[tolower(word[i])]++;      //将字符全部转换为小写,并以ascii值为下标,数组值为出现次数计数
        }
        words.push_back(word);
        if (!flag)                          //判断回车
        {
            break;
        }
}

第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
回车本身也是一个字符,getchar得到的是键盘流字符,须要清除一下键盘缓冲区:如用fflush(stdin); rewind(stdin);等
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
       这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
       scanf("%[^\n]",string);
       
 //getchar()的正确使用方式
 int main(void)
{
    int ch;
    int line_no = 0;
    int flag = 1;
    while((ch = getchar()) != EOF)
    {
        if (flag)
        {
            printf("%d--", line_no);
            flag = 0;
        }
        putchar(ch);
        if(ch == '\n')
        {
            line_no++;
            flag = 1;
        }
    }
}

getchar:int getchar(void);从标准输入流(stdin,通常是键盘)中读取一个字符。
函数声明在头文件<stdio.h>中。 getc:
int getc(FILE *stream);
从文件流中读取一个字符。
函数声明在头文件<stdio.h>中。 fgetc:
与 getc 完全相同,从文件中读取一个字符。
  
 scanf("%d", &n) 是从标准输入读入一个整数赋值给n,并且返回值是读入的值。
while( scanf(..) != EOF ) 就是一直从读取数据,直到读到一个EOF标记为止
EOF 是 end of line的意思,也就是行结束标识
  getline(cin,str)输入一行//gets也是一行,但是需要char arr[100]型
      string str;
    while(getline(cin,str)){
        if(islower(str[0])) str[0]=toupper(str[0]);
        for(int i=1;i<str.size();i++){
            if((str[i]==' '&&isalpha(str[i+1]))||(str[i]=='\t'&&isalpha(str[i+1]))||(str[i]=='\r'&&isalpha(str[i+1]))||(str[i]=='\n'&&isalpha(str[i+1]))){
                if(islower(str[i+1])) str[i+1]=toupper(str[i+1]);
            }
        }
        cout<<str<<endl;
    }

cin.get()该函数有三种格式:无参,一参数,二参数即cin.get(),cin.get(char ch), cin.get(array_name, Arsize) 读取字符的情况:输入结束条件:Enter键对结束符处理:不丢弃缓冲区中的Entercin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,即:ch=cin.get() 与 cin.get(ch)是等价的。
 

sstream输入流

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int main()
{
    string str;

    while(getline(cin,str)){
        string word1;
        string word2;
      //隔行的还是选择行读好了,使用cin有风险,不用置零,清一下vec即可
        getline(cin,word1);
        getline(cin,word2);

      //输入流输入范例
        string buf;
        stringstream ss(str);
        vector<string> vec;
        while(ss>>buf) vec.push_back(buf);

        for(auto it=vec.begin();it!=vec.end();it++){
            if(*it==word1) *it=word2;
            cout<<*it<<" ";
        }
        cout<<endl;
        vec.clear();
    }
    return 0;
}
//int型转string型变得这么简单
stringstream sstream;
    string strResult;
    int nValue = 1000;
 
    // 将int类型的值放入输入流中
    sstream << nValue;
    // 从sstream中抽取前面插入的int类型的值,赋给string类型
    sstream >> strResult;
 
    cout << "[cout]strResult is: " << strResult << endl;
    printf("[printf]strResult is: %s\n", strResult.c_str());
//string型转int型
int str_to_int(const string &string_temp){
    int temp;
    stringstream stream(string_temp);
    stream>>temp;
    return temp;
}

sstream输入排序实例istringstream

/*
    考察字符串的划分和排序
    我用的是istringstream 对读入的字符串进行划分,但是时间会比sscanf慢
    毕竟io还是c快的多
*/
 
#include <bits/stdc++.h>
using namespace std;
struct Log{
    string s; // 保存原本的数据
    string name; // 名字
    double time; // 记录时间
}logs[10000];
bool cmp(Log a,Log b){ // 排序函数
    if(a.time == b.time) return a.name<b.name;
    else return a.time<b.time;
}
int main(){
    int i = 0;
    while(getline(cin,logs[i].s)){ // 读入一行
        istringstream is(logs[i].s); // 绑定s,对读入的数据进行划分
        string str1,str2,str3;
        //hs_10000_p   2007-01-17 19:22:53,315     253.035(s)
        is>>str1>>str2>>str3>>logs[i].time;
        logs[i].name = str2+str3;
        i++;
    }
    sort(logs,logs+i,cmp); // 排序
    for(int j=0;j<i;j++){
        cout<<logs[j].s<<endl;
    }
}

sscanf输入实例


#include <cstdio>
#include <algorithm>
using namespace std;
 
struct Message {
    char raw[101];
    char task[21];
    int year, month, day;
    int hour, minute, second, msecond;
    int timeSecond, timeMsecond;
 
    bool operator < (const Message& b) const {
        if(timeSecond != b.timeSecond) return timeSecond < b.timeSecond;
        if(timeMsecond != b.timeMsecond) return timeMsecond < b.timeMsecond;
        if(year != b.year) return year < b.year;
        if(month != b.month) return month < b.month;
        if(day != b.day) return day < b.day;
        if(hour != b.hour) return hour < b.hour;
        if(minute != b.minute) return minute < b.minute;
        if(second != b.second) return second < b.second;
        return msecond < b.msecond;
    }
} message[10000];
 
int main() {
    int cnt = 0;
    while(gets(message[cnt].raw)) {
        sscanf(message[cnt].raw, "%s %d-%d-%d %d:%d:%d,%d %d.%d",   
               message[cnt].task, &message[cnt].year, &message[cnt].month,
               &message[cnt].day, &message[cnt].hour, &message[cnt].minute,
               &message[cnt].second, &message[cnt].msecond, &message[cnt].timeSecond, &message[cnt].timeMsecond);
        cnt++;
    }
    sort(message, message+cnt);
    for(int i = 0; i < cnt; i++) {
        printf("%s\n", message[i].raw);
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 1. C++中各种输入输出函数总结 与输入输出流操作相关的类关系 2. 键盘输入输出函数 2.1. scanf函数...
    不学习不快乐阅读 534评论 0 0
  • 浅谈C++常用输入输出 在编写C++程序的时候,经常因为输入输出头疼,所以在这里做一个小结,记录一下常用的输入输出...
    MinoyJet阅读 3,746评论 0 6
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,721评论 0 6
  • 一、输入和输出流 C 语言的标准输入输出函数都是独立于设备的,不需要考虑如何在特定设备上传输数据;C 语言的库函数...
    seraphzxz阅读 1,118评论 0 51
  • 暑假oj练习 C++基础 变量 1)整型 int 4Byte 32bit, long long 8byte 4...
    锦绣拾年阅读 1,515评论 0 0