• C学习笔记(四)格式化输入输出


    字符串

    字符串(character string)就是一个或多个字符的序列。

    "Zing went the strings of my heart!"

    C没有专门定义字符串的变量类型,而是把它存储在char数组中。

    存储字符串的数组的最后一个元素是\0,这个字符是空字符(null character),用来标记字符串的结束。空字符不是数字0,它是非打印字符,它的ASCⅡ码值为0。

    strlen()和sizeof()

    strlen()计算字符串的长度,sizeof()计算变量在内存中占的字节数。

    常量和C预处理器

     使用C预处理器定义常量。

    #define MAX 100

    const修饰符

    const int MAX=100;

    系统定义的明显常量

     C头文件limits.h和float.h分别提供关于整型和浮点型的大小限制的信息。其中定义了一些常量,例如limits.h包含下面类似的行:

    #define INT_MAX   +32767
    #define INT_MIN    -32768

    以下是limits.h中的一些常量

     

    以下是float.h中的一些符号常量

     

    printf()函数

    类似于%d这样的符号叫做转换说明,他们指定了如何把数据转换成可显示的形式。

     

     控制字符串是一个描述项目如何打印的字符串,它就是双引号内的语句。它包含两部分:实际要打印的字符,转换说明。

    printf()转化说明修饰符

     

    printf()的标志

    使用修饰符和标志的示例

    以下是整数输出的例子

    #include <stdio.h>
    #define PAGES 931
    int main (void)
    {
    printf("*%d*\n",PAGES);
    printf("*%2d*\n",PAGES);
    printf("*%10d*\n",PAGES);
    printf("*%-10d*\n",PAGES);
    return 0;
    }

    输出结果如下:

    *931*
    *931*
    *       931*
    *931       *

    以下是浮点数输出的例子

    #include <stdio.h>
    int main (void)
    {
    const double RENT=3852.99;
    
    printf("*%f*\n",RENT);
    printf("*%e*\n",RENT);
    printf("*%4.2f*\n",RENT);
    printf("*%3.1f*\n",RENT);
    printf("*%10.3f*\n",RENT);
    printf("*%10.3e*\n",RENT);
    printf("*%+4.2f*\n",RENT);
    printf("*%010.2f*\n",RENT);
    return 0;
    }

    输出结果如下:

    *3852.990000*
    *3.85299e+03*
    *3852.99*
    *3853.0*
    *  3852.990*
    * 3.863e+03*
    *+3852.99*
    *0003852.99*

    以下是其他组合的例子:

    #include <stdio.h>
    int main (void)
    {
    printf("%x %X %#x\n",31,31,31);
    printf("**%d**% d**% d**\n",42,42,-42);
    printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6);
    return 0;
    }

    输出结果如下:

    1f 1F 0x1f
    **42** 42**-42**
    **    6**  006**00006**  006**

     以下是字符串输出的例子:

    #include <stdio.h>
    #define BLURB "Authentic imitation!  "
    int main(void)
    {
    printf("/%2s/\n",BLURB);
    printf("/%24s/\n",BLURB);
    printf("/%24.5s/\n",BLURB);
    printf("/%-24.5s/\n",BLURB);
    return 0;
    }

    输出结果如下:

    /Athentic imitation!     /
    /    Authentic imitation!/
    /                   Authe/
    /Authe /

     转换说明的意义

    转换说明把存储在计算机中的二进制格式的数值转换成一系列字符(一个字符串)以便于显示。

    例如,数字67的内部存储形式可能是二进制01001100。%d转换说明符将它转换成字符7和6,并显示成76。

    %x把相同的值转换成十六进制的4c。%c把相同的值转换成L。

    转换说明其实就是翻译说明。%d意为“把给定的值翻译成十进制整数文本表示,并打印出来”。

    不匹配的转换

    不匹配的整数转换

    #include <stdio.h>
    #define PAGES 336
    #define WORDS 65618
    int main (void)
    {
    short num=PAGES;
    short mnum=-PAGES;
    printf("num as short and unsigned short: %hd %hu\n",num,num);
    printf("-num as short and unsigned short: %hd %hu\n",mnum,mnum);
    printf("num as int and char: %d %c\n",num,num);
    printf("WORDS as int,short,and char: %d %hd %c\n",WORDS,WORDS,WORDS);
    return 0;
    }

    输出结果如下

    num as short and unsigned short: 336 336
    -num as short and unsigned short: -336 65200
    num as int and char: 336 P
    WORDS as int,short and char: 65618 82 R

     mnum的无符号输出结果是65200却不是336.这是由于有符号short int值在此参考系统中的表示方式造成的。

    首先,它们的大小是2字节。其次该系统使用被称为2的补码的方式表示有符号整数。在这种方法中,数字0到32767代表它们本身,而数字32768到65535则代表负数,65535代表-1、65534代表-2,以此类推。

    因此,-336由65536-336,也即65200来表示。当被解释成一个有符号整数时,65200代表-336;当被解释成无符号整数时,65200则代表65200。当然,并不是所有系统都是用这样的方法。

    这即是说,%u转换不能把符号和数字分开。

    看第三行的输出结果,可以知道当把一个大于255的值转换成字符时,short int占系统的2个字节,而char占1个字节,当printf打印时只截取了两个字节中的一个字节。

    相当于以256为除数,取该数字被除后的余数再转换。

    最后以short int输出一个更大的值也跟上面一样,4个字节取了其中两个字节转换输出。

    不匹配的浮点数转换

    #include <stdio>
    int main(void)
    {
    float n1=3.0;
    double n2=3.0;
    long n3=2000000000;
    long n4=1234567890;
    
    printf("%.1e %.1e %.1e %.1e\n",n1,n2,n3,n4);
    printf("%ld %ld\n",n3,n4);
    printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
    return 0;
    }

    输出结果如下:

    3.0e+00 3.0e+00 3.1e+46 1.7e+266
    2000000000 1234567890
    0 1074266112 0 1074266112

    当使用%e打印n3时,%e期望一个double类型值,在本系统这是一个8字节的值。当printf()查看n3(它在本系统中是一个4字节值)时,它也查看了邻近的4个字节,其中只有一部分是真正的n3。

    输出的第三行表示,如果printf()在其他的地方出现不匹配的错误,即使正确的说明符也会产生虚假的结果。

    printf("%ld %ld %ld %ld",n1,n2,n3,n4);

     该调用把四个变量传递给计算机,计算机把它们堆栈中。计算机根据变量的类型将数据放入堆栈中而不是根据转换说明符。

    所以n1和n2各占8个字节(float被转换成double),而n3和n4各占4个字节。

    然后printf()函数按照转换说明符将堆栈中的数据读取出来,%ld只读取4个字节,但是n1和n2都占8个字节,因此即使n3和n4的转换说明符正确,printf()函数也会读取错误的字节。

    printf()函数的返回值

    printf()函数的返回值是所打印的字符的数目。如果输出有错误,会返回一个负数或者其他值。

    int s;
    s=printf("what do you wangt to do?\n");
    printf("%d",s);

    输出结果是

    what do you want to do?
    26

    打印较长的字符串

    #include <stdio.h>
    int main(void)
    {
    printf("Here's one way to print a ");
    printf("long string.\n");
    printf("Here's another way to printf a \
    long string.\n");
    printf("Here's the newest way to printf a "
              "long string.\n");        /*ANSI C*/
    return 0;
    }    

    scanf()函数

    以下是转换说明符

     

    以下是转换修饰符

     

    从scanf()角度看输入

     当使用%d来读取一个整数,scanf()会跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。当scanf()遇到一个数字字符或者一个符号,它会保存并读取下一个字符;就这样scanf()会持续读取和保存字符直到它遇到一个非数字字符。如果遇到一个非数字的字符,它就得出结论:数字到了尾部。这就意味当程序下次开始读取的时候,将从前面被放弃的那个非数字字符开始。如果使用了字段宽度,那么scanf()在字段结尾或者在第一个空白字符处(两者最先到达的一个)终止。

    如果第一个非空白字符不是数字,是一个char类型字符,那么scanf()会把字符放回输入,并停在那里。没有把任何值赋给变量,下次的读取时就会从那个字符开始。

    如果使用%s,那么空白字符以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到一个非空白字符,然后保存直到遇到再次遇到空白字符之前的所有非空白字符。这就意味着%s使scanf()读取一个不含空白字符的字符串。如果使用了字段宽度,那么scanf()在字段结尾或者在第一个空白字符处(两者最先到达的一个)终止。

    如果使用%c,那么所有的字符都是平等的,不会跳过空白字符。如果在%c前有一个空格,那么scanf()会跳到第一个非空白字符处。也就是说,scanf("%c",&ch)读取在输入中遇到的第一个字符,而scanf(" %c",&ch)则读取遇到的第一个非空白字符。

    scanf()的返回值

    scanf()返回成功读入的项目的个数,如果没有读入任何项目,它会返回0。

    当它检测到“文件尾部”时,返回EOF(EOF是在stdio.h中定义的特殊值。一般EOF被定义为-1)。

     printf()和scanf()的*修饰符

    当转换说明符是%*d,那么参数列表应该包含一个*的值和一个d的值,*的参数告诉函数字段宽度是多少。

    #include <stdio.h>
    int main(void)
    {
    unsigned width,precision;
    int number=256;
    double weight=242.5;
    
    printf("What field width?\n");
    scanf("%d",&width);
    printf("The number is: %*d: \n",width,number);
    printf("Now enter a width and a precision:\n");
    scanf("%d %d",&width,&precision);
    printf("Weight=%*.*f\n",width,precision,weight);
    return 0;
    }

    而在scanf()中,当*在%和说明符字母之中,它使函数跳过相应的项目。

    #include <stdio.h>
    int main(void)
    {
    int n;
    
    printf("Please enter three integers:  \n");
    scanf("%*d %*d %d",&n);
    printf("The last integer was %d\n",n);
    return 0;
    }
  • 相关阅读:
    redis 持久化
    Hyper-V虚拟机Redhat添加网卡找不到网卡配置文件解决方法
    java 查看ssl log
    iptables配置https防火墙策略
    java 一致性哈希源码 转
    mysql主备配置方法
    hibernate 缓存配置
    Hibernate中文乱码
    HttpPost 中文编码问题 EntityBuilder
    apache 配置tomcat代理
  • 原文地址:https://www.cnblogs.com/hahazexia/p/3011592.html
Copyright © 2020-2023  润新知