• 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(),清楚输出缓冲区。


  • 相关阅读:
    How to become a hacker
    逻辑地址、线性地址、物理地址和虚拟地址
    java configuration
    Java 理论与实践: 变还是不变?
    Teach Yourself Programming in Ten Years
    border padding margin , the difference among them
    hashCode方法,equals方法,HashSet,HasMap之间的关系
    工程名 显示红色叹号
    记The_C_Programming_Language的错误
    VIM简单介绍学习1
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6837294.html
Copyright © 2020-2023  润新知