• 重学C语言---04字符串和格式化输入/输出


    1、程序示例

    //talkback.c一个能为你提供一些信息的对话框
    #include <stdio.h>
    #include <string.h>        //提供strlen函数原型
    #define     DENSITY 62.4    //人的密度(单位是:英镑/每立方英尺
    int main()
    {
        float weight,volume;
        int size,letters;
        char name[40];    //name是一个有40个字符的数组
        
        printf("Hi!What's your first name?
    ");
        scanf("%s",name);
        printf("%s,what's your weight in pounds?
    ",name);
        scanf("%f",&weight);
        size = sizeof name;
        letters = strlen(name);
        volume = weight/DENSITY;
        printf("Well,%s,your volume is %2.2f cubic feet.
    ",name,volume);
        printf("Also ,your first name has %d letters,
    ",letters);
        printf("and we have %d bytes to store it in .
    ",size);
        return 0; 
    } 

     上述程序的新特性:

    •  使用一个数组(array)来存放一个字符串,该数组是内存中一串连续的40个字节,其中每个字节都存放一个字符值。
    • 使用%s转换说明符,来处理字符串的输入和输出。注意,在scanf()中,weight用了&前缀,而name没有用。
    • 使用C的预处理器定义代表值62.4的符号常量DENSITY。
    • 使用C函数strlen()来获取字符串的长度

    2、字符串简介

      字符串(character string )---就是一个或多个字符的序列。如"Zing went the strings of my heart!",双引号不是字符串的一部分,只是通知编译器其中包含了一个字符串,正如单引号标识着一个字符一样。

      2.1、char数组类型和空字符串

        C没有为字符串定义专门的变量类型,而是把它存储在char数组中。字符串的字符存放在相邻的内存中,每个字符占据一个单元;而数组由相邻存储单元组成。

      如下图

      

      数组的最后一个位置显示字符,这个字符就是空字符,C用空字符来标记字符串的结束,空字符不是0,它是非打印字符,他的ASCII值的确为0,所以该字符的存在意味着数组单元必须至少比要存储的字符数多1.

      2.2 什么是数组

        数组---就是同一类型的数据元素的有序序列。

        char name[40] ; 此声明创建了一个有40个存储单元的数组,其中每一个单元存储一个char 类型的值。

      

      2.3、使用字符串

      如下程序:

      

    /*praise.c使用不同类别的字符串*/
    #include <stdio.h>
    #define PRAISE "What a super marvelous name!"
    
    int main(void)
    {
    	char name[40];
    	printf("Whar is your name?
    ");
    	scanf("%s",name);
    	printf("Hello %s.%s
    ",name,PRAISE);
    	return 0;
    }
    

      

    结果如上图,无需将空字符插入到数组中,scanf()在读取输入时会替我们完成这项任务。

    注意:scanf()只读取了Ivan fu的名字Ivan,scanf()开始读取输入后,会遇到一个空白字符空格(blank)、制表符(tab)或者换行符(newline)处停止读取。一般情况下,使用%s()只会把一个单词而不是一个完整的句子作为字符串输入,C使用了其他读取输入函数(如get是())来处理一般的字符串。

      2.4、区别字符和字符串

      字符--'x';

      字符串--"x"

       2.5、strlen()函数

       上一章出现的sizeof运算符,它的作用是以字节为单位给出数据大小。strlen()以字符为单位给出字符串的单位。因为一个字符只占用一个字节,但是却不能把2个函数运用到同一个字符串得到相同的结果。

    如下列程序,给出详细解释。

    /*praise.c使用不同类别的字符串*/
    #include <stdio.h>
    #define PRAISE "What a super marvelous name!"
    
    int main(void)
    {
    	char name[40];
    	printf("Whar is your name?
    ");
    	scanf("%s",name);
    	printf("Hello %s.%s
    ",name,PRAISE);
    	printf("Your name of %d letters occupies %d memory cells.
    ",strlen(name),sizeof name);
    	printf("The phrase of praise has %d letters",strlen(PRAISE));
    	printf("and occupies %d memory cells.
    ",sizeof PRAISE);
    	return 0;
    }
    

    由结果可知道,根据sizeof 运算符的报告,数组name有40个内存单元。但是只用了4个单元来存储Ivan,这是strlen()报告的。数组的第五个单元放置空字符串,它的存在告诉strlen()在哪里停止计数。对于PRAISE,strlen()再一次给出了字符串中字符的准确数目,sizeof运算符提供的数目总是比前者大1,这是因为它把从来标志字符串结束的不可见的空字符也计算在内。您并没有告诉计算机为存储该语句分配多大内存,它必须自己计算处双引号之间的字符的数目。

    3、常量和C预处理器

      在我们程序中,有些数据有可能固定不变,因此我们就用常量来标识。

      例如π这个数,如果每次都要写,一更改会造成混乱,因此用符号常量来解决这个麻烦。

      3.1、C中,预处理器用#define来定义常量,注意这里没有“=”符号,常量符号一般用大写表示。

      例如:#define  Pi  3.14159

      3.2、const修饰符--常量的第二种定义方法。

        const int MONTH = 12;

    4、研究printf()和scanf()函数

      printf()和scanf()函数时我们能够与程序通信。它们被称为输入输出函数,或者I/O函数。下面我们介绍这两个函数的工作原理。

      4.1printf()函数

      请求printf()打印变量的指令取决于变量的类型。%d、%s这些符号被称为转换符,它们指定了如何把数据转换成可显示的形式。如下表

      

      printf()的使用格式

        printf(Control-string,item,item1...);

         item、item1等等都是要打印的项目,可以是变量,也可以是常量。

         控制字符串是一个描述该项目的如何打印的字符串,控制字符串应该为每个要打印的项目包含一个转换说明符。下图解释了格式原理

      

       4.2、scanf()函数

      使用scanf()函数的简单规则:

    • 如果使用scanf()来读取基本变量类型的值,在变量名前家加一个&(取地址符)
    • 如果使用scanf()把一个字符串读取到一个字符数组中,不要使用&  

      

    // input.c -- when to use & 
    #include <stdio.h>
    int main(void)
    {
        int age;             // variable 
        float assets;        // variable 
        char pet[30];        // string   
    
        printf("Enter your age, assets, and favorite pet.
    ");
        scanf("%d %f", &age, &assets); // use the & here      
        scanf("%s", pet);              // no & for char array 
        printf("%d $%.2f %s
    ", age, assets, pet);
        
        return 0;
    }
    

      

  • 相关阅读:
    第12章,存储类别、链接和内存管理
    第11章 字符串和字符串函数
    第10章 数组和指针
    第9章 函数
    第8章 字符输入/输出和输入验证
    第7章,c语言控制语句:分支和跳转
    第六章,处语言控制语句:循环
    中国互联网发展史
    世界互联网发展史
    世界计算机发展史
  • 原文地址:https://www.cnblogs.com/Ivan-Fu/p/7681787.html
Copyright © 2020-2023  润新知