zoukankan      html  css  js  c++  java
  • c和c++的输入输出

    格式输出: 
    printf(格式控制, 输出表列);
    %d 十进制数  %md m为指定的宽度 若数据位数小于m,则左端补以空格;若大于m,则按实际位数输出
    %ld 长整型数据  %mld 指定字段宽度
    %o 八进制整数形式  %mo
    %x 十六进制整数形式  %mx
    %u unsigned型数据,它也可用%o或%x格式输出
    %c 一个字符   %mc
    %s 字符串 有几种使用方法
     1.%s
       printf("%s", "China");
       输出 China
     2.%ms 控制为m列 若串长小于m, 则左补空格,大于则突破m限制,将字符串全然输出
     3.%-ms 若串长小于m, 则右补空格(居左)
     4.%m.ns 输出占m列,取字符串左端n个字符.这n个字符输出在m列的右側,左补空格
     5.%-m.ns m.n同上,这n个字符输出在m列的左側,右补空格.若n>m,则m自己主动取n值,保证n个字符正常输出
    %f 输出实数(包含单.双精度),以小数形式输出
     1.%f 输出所有整数部分,输出6位小数
     2.%m.nf 指定输出的数据共占m列,当中有n位小数.若数值长度小于m,则左端补空格
     3.%-m.nf 指定输出的数据共占m列,当中有n位小数.若数值长度小于m,则右端补空格
    %e 以指数形式输出实数
     1.%e 不指定输出数据所占的宽度和数字部分的小数数位,数值按规范化输出
     2.%m.ne 和 %-m.ne 输出占m列,n指输出的数据的小数部分(尾数)的小数数位,-同上
    %g 输出实数,依据数值大小,自己主动选择f格式或者e格式(选择输出宽度小的),且不输出无意义的零
    格式控制中能够包括转义字符,如'/n' '/t' '/b' '/r'
    输出%的方法 printf("%f%%", 1.0/3) 输出: 0.333333%


    格式输入
     

    scanf(格式控制, 地址表列) sscanf
    类似printf .以例程解释
    1. scanf("%3d%3d", &a, &b); //列数截取数据
       input -> 123456
       then -> a = 123  b = 456
    2. scanf("%2d %*3d %2d", &a, &b) //*表示跳过列数读取数据
       input -> 12 345 67
       then -> a = 12 b = 67
    3. scanf("%d, %d", &a, &b)
       input -> 1, 4  //在格式控制中,假设有非格式说明外的字符,应该在输入时在相应位置输入该字符
       scanf("%d   %d", &a, &b)  //输入时,两数据应有不少于格式控制中的空格
       scanf("%c%c%c", &a, &b, &c)  //用%c输入字符时,空格字符和转义字符都作为有效字符输入
    4. %s 输入字符串.将字符串传送到一个字符数组中,输入时以非空白字符開始,以第一个空白字符结束.
         字符串以串结束标志'/0'作为最后一个字符
    5. * 符用以表示该输入项读入后不赋予对应的变量。即跳过该输入值。 
       scanf("%d %*d %d",&a,&b);  //当输入为:1 2 3 时,把1赋予a,2被跳过。3赋予b。
    6. 在输入数据时,遇下面情况时觉得该数据结束
       (1)遇空格 或 回车 或 跳格(tab)
       (2)按指定的宽度结束. 如3列的%3d
       (3)非法输入
    7. 输入带空格的字符串
        scanf("%[^/n]%*c", str);
        对照方下
        #include <stdio.h>
        #include <string.h>
        int main()
        {
            char str[222];
            char c;
            scanf("%[^/n]", str);
            printf("%s", str);
            scanf("%c", &c);
            printf("%c", c);
            return 0;
        }
    8. 函数 int sscanf (const char *str,const char * format,........);
    sscanf()会将參数str的字符串依据參数format字符串来转换并格式化数据。

    转换后的结果存于相应的參数内。
    sscanf与scanf类似,都是用于输入的,仅仅是scanf以stdin为输入源,前者以固定字符串为输入源。
        # include < stdio. h>
        int main( )
        {
              const char * s = "iios/12DDWDFF@122" ;
              char buf[ 20] ;

              sscanf ( s, "%*[^/]/%[^@]" , buf ) ;
              printf ( "%s/n" , buf ) ;

              return 0;
        }
        结果为: 12DDWDFF
    9. scanf 和 sscanf 的一些特殊使用方法:(类似正则)
        %[a-z] 表示匹配a到z中随意字符,贪婪性(尽可能多的匹配)
        %[aB'] 匹配a、B、'中一员。贪婪性
        %[^a] 匹配非a的随意字符,贪婪性
            1. 常见使用方法。
              charstr[ 512] = { 0} ;
              sscanf( "123456" , "%s" , str) ;
              printf( "str=%s" , str) ;
            2. 取指定长度的字符串。如在下例中。取最大长度为4字节的字符串。
              sscanf( "123456" , "%4s" , str) ;
              printf( "str=%s" , str) ;
            3. 取到指定字符为止的字符串。如在下例中。取遇到空格为止字符串。
              sscanf( "123456abcdedf" , "%[^]" , str) ;
              printf( "str=%s" , str) ;
            4. 取仅包括指定字符集的字符串。如在下例中。取仅包括1到9和小写字母的字符串。
              sscanf( "123456abcdedfBCDEF" , "%[1-9a-z]" , str) ;
              printf( "str=%s" , str) ;
            5. 取到指定字符集为止的字符串。如在下例中。取遇到大写字母为止的字符串。
              sscanf( "123456abcdedfBCDEF" , "%[^A-Z]" , str) ;
              printf( "str=%s" , str) ;
        % [ ] 的使用方法:
        % [ ] 表示要读入一个字符集合, 假设[ 后面第一个字符是”^”,则表示反意思。
            [ ] 内的字符串能够是1或很多其它字符组成。

    空字符集(% [ ] )是违反规则的。可导致不可预知的结果。% [ ^ ] 也是违反规则的。


        % [a-z]
            读取在 a-z 之间的字符串。假设不在此之前则停止,如
            char s[ ] = "hello, my friend” ; // 注意: ,逗号在不 a-z之间
            sscanf( s, “%[a-z]”, string ) ; // string=hello
        %[^a-z] 
            读取不在 a-z 之间的字符串,假设碰到a-z之间的字符则停止,如
            char s[]=" HELLOkitty” ; // 注意: ,逗号在不 a-z之间
            sscanf ( s, “% [ ^ a- z] ”, string ) ; // string=HELLO
        %*[^=] 
            前面带 * 号表示不保存变量。跳过符合条件的字符串。


            char s[ ] = "notepad=1.0.0.1001" ;
            char szfilename [ 32] = "" ;
            int i = sscanf ( s, "%*[^=]" , szfilename ) ;
            // szfilename=NULL,由于没保存
            int i = sscanf ( s, "%*[^=]=%s" , szfilename ) ;
            // szfilename=1.0.0.1001
        %40c 读取40个字符
        %[^=] 
            读取字符串直到碰到’= ’号,’^’后面能够带很多其它字符, 如:
             char s[ ] = "notepad=1.0.0.1001" ;
            char szfilename [ 32] = "" ;
            int i = sscanf ( s, "%[^=]" , szfilename ) ;
            // szfilename=notepad


    字符串处理函数
     

    1.puts(字符数组)
       将一个字符串输出到终端
       char str[] = {"Hello otto./n"};
       puts(str);
    2.gets(字符数组)   warning: the `gets' function is dangerous and should not be used.
       从终端输入一个字符串到字符数组,而且返回字符数组的起始地址
       gets(str);
    3.strcat(字符数组1,字符数组2)
       把字符串2连接到字符串1后面,结果放在字符数组1中,并返回字符数组1的地址.
       a)字符数组1必须足够大,以容纳连接后的新字符串.
       b)连接时将字符串1后的'/n'取消,保留字符串2的'/n'
    4.strcpy(字符数组1,字符数组2)
       将字符串2拷贝到字符数组1中去.
       a)字符数组1必须足够大,以容纳连接后的新字符串.
       b)字符数组1必须写成数组名形式,字符数组2还能够是一个字符串常量
       c)复制时连同字符串后的'/n'一起拷贝到字符数组1中去
       d)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组
       e)能够用strncpy函数将字符串2中前面n个字符赋值到字符数组1中
            strncpy(str1, str2, n);  n不应大于str1的长度
    5.strcmp(字符串1, 字符串2)
       对两个字符串自左至右逐个字符相比(ASCII码,按英文字典顺序,在后面的为"大",小写字母比大写"大")
       返回比較结果:
         a)假设字符串1=字符串2,则函数值为0
         b)假设字符串1>字符串2,则函数值为一个正整数
         c)假设字符串1<字符串2,则函数值为一个负整数
    6.strlen(字符数组)
       返回字符串的实际长度(不包含'/n')
    7.strlwr(字符串)
       将字符串中大写字母换成小写字母
    8.strupr(字符串)
       将字符串中小写字母换成大写字母


    字符串的输入输出与空间分配:
     
    char p[34] = "string";
    gets(p);  //能够输入
    char *aa;
    //gets(aa);  //不能够输入
    aa = (char*)malloc(30);
    gets(aa);  //能够输入  分配空间


    getch()    getche()    getchar()
     

    getche()  有返回显示 //getch() with e(echo) 回显

        getchar()是stdio.h中的库函数。它的作用是从stdin流中读入一个字符,把该字符显示在屏幕上
        getch()和getche()是conio.h中的库函数。从键盘接收字符。

       
        差别在于: getchar()函数等待输入直到按回车才结束(前提是缓冲区没有数据)。回车前的全部输入字符都会逐个显示在屏幕上。但仅仅有第一个字符作为函数的返回值。getch()每次都等待用户的输入,由于getch()从键盘接收,即时的接收,并非从stdin流中去读取数据。



        getchar()从stdin流中读取字符,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符)。假设流队列不为空。运行getchar()就继续直到把回车符也放空为止,空了之后再在运行getchar()就停下等待你的输入了。
        getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其它字符会保留在键盘缓存区中,等待兴许getchar调用读取.也就是说, 兴许的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
      getch与 getchar基本功能同样,区别是getch直接从键盘获取键值,不等待用户按回车,仅仅要用户按一个键,getch就立马返回,getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数经常使用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用 getch函数暂停程序执行,当按随意键后程序继续执行.


     c与正則表達式 
      标准的C和C++都不支持正則表達式。但有一些函数库能够辅助C/C++程序猿完毕这一功能,当中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,很多Linux发行版本号都带有这个函数库。


      编译正則表達式 
      为了提高效率。在将一个字符串与正則表達式进行比較之前。首先要用regcomp()函数对它进行编译,将其转化为regex_t结构:
    int regcomp(regex_t *preg, const char *regex,int cflags);
      參数regex是一个字符串。它代表将要被编译的正則表達式;參数preg指向一个声明为regex_t的数据结构,用来保存编译结果;參数cflags决定了正則表達式该怎样被处理的细节。
      假设函数regcomp()运行成功,而且编译结果被正确填充到preg中后,函数将返回0,不论什么其他的返回结果都代表有某种错误产生。
      匹配正則表達式 
      一旦用regcomp()函数成功地编译了正則表達式,接下来就能够调用regexec()函数完毕模式匹配:
      int regexec(const regex_t *preg,
      const char *string, size_t nmatch,
      regmatch_t pmatch[], int eflags);
      typedef struct {
      regoff_t rm_so;
      regoff_t rm_eo;
      } regmatch_t;
      參数preg指向编译后的正則表達式。參数string是将要进行匹配的字符串,而參数nmatch和pmatch则用于把匹配结果返回给调用程序,最后一个參数eflags决定了匹配的细节。
      在调用函数regexec()进行模式匹配的过程中,可能在字符串string中会有多处与给定的正則表達式相匹配。參数pmatch就是用来保存这些匹配位置的,而參数nmatch则告诉函数regexec()最多能够把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时,从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串,而从 string+pmatch[1].rm_so到string+pmatch[1].rm_eo,则是第二个匹配的字符串,依此类推。
      释放正則表達式

      不管什么时候。当不再须要已经编译过的正則表達式时,都应该调用函数regfree()将其释放,以免产生内存泄漏。
    void regfree(regex_t *preg);
      函数regfree()不会返回不论什么结果,它仅接收一个指向regex_t数据类型的指针,这是之前调用regcomp()函数所得到的编译结果。
      假设在程序中针对同一个regex_t结构调用了多次regcomp()函数,POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放。但建议每次调用regcomp()函数对正則表達式进行编译后都调用一次regfree()函数,以尽早释放占用的存储空间。
      报告错误信息 
      假设调用函数regcomp()或regexec()得到的是一个非0的返回值。则表明在对正則表達式的处理过程中出现了某种错误,此时能够通过调用函数regerror()得到具体的错误信息。
      size_t regerror(int errcode,const regex_t *preg, char *errbuf,size_t errbuf_size);
      參数errcode是来自函数regcomp()或regexec()的错误代码,而參数preg则是由函数regcomp()得到的编译结果,其目的是把格式化消息所必须的上下文提供给regerror()函数。在运行函数regerror()时。将依照參数errbuf_size指明的最大字节数。在errbuf缓冲区中填入格式化后的错误信息,同一时候返回错误信息的长度。
      应用正則表達式 
      最后给出一个详细的实例,介绍怎样在C语言程序中处理正則表達式。

    1. #include <stdio.h>  
    2. #include <sys/types.h>  
    3. #include <regex.h>  
    4. /* 取子串的函数 */  
    5. static char* substr(const char*str,  
    6. unsigned start, unsigned end)  
    7. {  
    8.     unsigned n = end - start;  
    9.     static char stbuf[256];  
    10.     strncpy(stbuf, str + start, n);  
    11.     stbuf[n] = 0;  
    12.     return stbuf;  
    13. }  
    14. /* 主程序 */  
    15. int main(int argc, char** argv)  
    16. {  
    17.     char * pattern;  
    18.     int x, z, lno = 0, cflags = 0;  
    19.     char ebuf[128], lbuf[256];  
    20.     regex_t reg;  
    21.     regmatch_t pm[10];  
    22.     const size_t nmatch = 10;  
    23.     /* 编译正則表達式*/  
    24.     pattern = argv[1];  
    25.     z = regcomp(?, pattern, cflags);  
    26.     if (z != 0)  
    27.     {  
    28.         regerror(z, ?, ebuf, sizeof(ebuf));  
    29.         fprintf(stderr, "%s: pattern '%s'",    ebuf, pattern);  
    30.         return 1;  
    31.     }  
    32.     /* 逐行处理输入的数据 */  
    33.     while(fgets(lbuf, sizeof(lbuf), stdin))  
    34.     {  
    35.         ++lno;  
    36.         if ((z = strlen(lbuf)) > 0 && lbuf[z-1]    == '    ')  
    37.             lbuf[z - 1] = 0;  
    38.         /* 对每一行应用正則表達式进行匹配 */  
    39.         z = regexec(?

      , lbuf, nmatch, pm, 0);  

    40.         if (z == REG_NOMATCH) continue;  
    41.         else if (z != 0)  
    42.         {  
    43.             regerror(z, ?, ebuf, sizeof(ebuf));  
    44.             fprintf(stderr, "%s: regcom('%s')",    ebuf, lbuf);  
    45.             return 2;  
    46.         }  
    47.         /* 输出处理结果 */  
    48.         for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x)  
    49.         {  
    50.             if (!x) printf("%04d: %s", lno, lbuf);  
    51.                 printf(" $%d='%s'", x, substr(lbuf, pm[x].rm_so,pm[x].rm_eo));  
    52.         }  
    53.     }  
    54.     /* 释放正則表達式 */  
    55.     regfree(?

      );  

    56.     return 0;  
    57. }  
    上述程序负责从命令行获取正則表達式。然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。

    运行以下的命令能够编译并运行该程序:
    # gcc regexp.c -o regexp
    # ./regexp 'regex[a-z]*' < regexp.c
    0003: #include <regex.h>
    $0='regex'
    0027: regex_t reg;
    $0='regex'
    0054: z = regexec(?

    , lbuf, nmatch, pm, 0);

    $0='regexec'

    1.cin>>i>>j;是用空格或TAB来分隔输入的. 假设是cin>>i;cin>>j;必须先输入i,再回车,最后输入j .

    2.cout<<:   设 int x=30, y=300, z=1024;

               1)    cout<<x<<' '<<y<<' '<<z<<endl;  //按十进制输出            
               2) 数字进制:使用hex、dec、oct分别控制输出数字的十六,十,八进制
                      cout<<hex<<x<<' '<<y<<' '<<z<<endl;//x,y,z都按十六进制输出
               3) 怎样对齐:使用setw控制宽度
                      cout<<x<<setw(30)<<y<<endl;

                      //X正常输出,而Y左边会空出28个空格
                      默认对齐方式为右对齐,即填充字符从左開始,最后是输出字符.
                     假设setiosflags(ios::left),则填充字符在右,输出字符在前.
              4) 填充字符:使用setfill控制填充字符
                      cout<<x<<setfill('.')<<setiosflags(ios::left)<<setw(30)<<y<<endl;//28个空格用"."填充.
                    填充时,假设实际长度比设置长度短,则按实际长度输出.
              5) 设置精度:使用setprecision控制输出精度
              6)怎样取消对齐:
                  cout<<resetiosflags(ios::left);//取消左对齐.由于对齐是针对全部输出都有效果,而不专对近期的一个输出.
              7)怎样取消填充:
                    setfill()怎样取消呢?
                    cout<<setfill(' '); 就能够了.
                    注意: ' '之间是一个空格符. 由于setfill()也是对全部输出有效,仅仅要你设置了setw().
             8) 浮点控制格式:
                 cout.setf(ios:: );//这也是针对全部输出有效的.
                 经常使用的有;
               ios::fixed固定的浮点显示
               ios::scientific指数表示,科学记数法 
               ios::left / ios::right 左/右对齐
               ios::skipws忽略前导空白
               ios::uppercase / ios::lowercase 十六进制大/小写输出
               ios::showpos强制在正数前加+号
               ios::showpoint 强制显示小数点后的无效0  
              precision(18);   //精度为18        
               比如:
         float f=2.0/3.0,f1=0.000000001,f2=-9.9;
        cout<<f<<' '<<f1<<' '<<f2<<endl;      //正常输出 
        cout.setf(ios::showpos);              //强制在正数前加+号 
        cout<<f<<' '<<f1<<' '<<f2<<endl; 
        cout.unsetf(ios::showpos);            //取消正数前加+号 
        cout.setf(ios::showpoint);            //强制显示小数点后的无效0 
        cout<<f<<' '<<f1<<' '<<f2<<endl; 
        cout.unsetf(ios::showpoint);          //取消显示小数点后的无效0 
        cout.setf(ios::scientific);           //科学记数法 
        cout<<f<<' '<<f1<<' '<<f2<<endl;  
        cout.unsetf(ios::scientific);         //取消科学记数法 
        cout.setf(ios::fixed);                //按点输出显示 
        cout<<f<<' '<<f1<<' '<<f2<<endl; 
        cout.unsetf(ios::fixed);              //取消按点输出显示 
        cout.precision(18);                   //精度为18。正常为6 
        cout<<f<<' '<<f1<<' '<<f2<<endl; 
        cout.precision(6);                    //精度恢复为6

    操纵算子实现相同的功能:例如以下:

    float f=2.0/3.0,f1=0.000000001,f2=-9.9;

        cout<<f<<' '<<f1<<' '<<f2<<endl;      //正常输出

        cout<<setiosflags(ios::showpos);      //强制在正数前加+号

        cout<<f<<' '<<f1<<' '<<f2<<endl;

        cout<<resetiosflags(ios::showpos);    //取消正数前加+号

        cout<<setiosflags(ios::showpoint);    //强制显示小数点后的无效0

        cout<<f<<' '<<f1<<' '<<f2<<endl;

        cout<<resetiosflags(ios::showpoint);  //取消显示小数点后的无效0

        cout<<setiosflags(ios::scientific);   //科学记数法

        cout<<f<<' '<<f1<<' '<<f2<<endl;  

        cout<<resetiosflags(ios::scientific); //取消科学记数法

        cout<<setiosflags(ios::fixed);        //按点输出显示

        cout<<f<<' '<<f1<<' '<<f2<<endl;

        cout<<resetiosflags(ios::fixed);       //取消按点输出显示

        cout<<setprecision(18);               //精度为18,正常为6

        cout<<f<<' '<<f1<<' '<<f2<<endl;

        cout<<setprecision(6);                //精度恢复为6

    9) 其他的输出方法:

    还有些为了让缓冲区不影响程序的正确操作的缓冲去的操作,如:cin.putback(),fflush(stdin),cout.flush().我们

    做一下简单的说明。

        1、getch()和getche(),非缓冲式输入。从键盘读入一个字符。getch()读入字符不显示。有conio.h支持。

        2、cin.get(),getchar()。缓冲式输入。从键盘读入一个字符,并显示。

    getchar()由stdio.h支持,cin.get()由iostream.h支持。

        3、putch()和putchar(),非缓冲式输出,输出一个字符到显示器。putch()由conio.h支持,putchar()由stdio.h支持。

        4、cout.put(),缓冲式输出,输出一个字符到显示器。

    由iostream.h支持。

        5、gets()和cin.geline(),缓冲式输入,读入一字符串(包含空格,不包含最后的回车),gets()由stdio.h支持。cin.getline()由iostream.h支持。

        6、puts()。非缓冲输出,输出一个字符串,由stdio.h支持。

        7、cin.putback(),把一个字符送回输入缓冲区。

        8、fflush(stdin),清除输入缓冲区操作。无法清除cin.get()等带来的操作。

        9、cout.flush(),清楚输出缓冲区。


  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6837294.html
Copyright © 2011-2022 走看看