zoukankan      html  css  js  c++  java
  • 重学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;
    }
    

      

  • 相关阅读:
    129 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 02 懒汉式的代码实现
    128 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 01 饿汉式的代码实现
    127 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 02 单例模式概述 01 单例模式的定义和作用
    126 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 01 设计模式概述 01 设计模式简介
    125 01 Android 零基础入门 02 Java面向对象 05 Java继承(下)05 Java继承(下)总结 01 Java继承(下)知识点总结
    leetcode-----121. 买卖股票的最佳时机
    leetcode-----104. 二叉树的最大深度
    Json串的字段如果和类中字段不一致,如何映射、转换?
    Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
    模糊查询
  • 原文地址:https://www.cnblogs.com/Ivan-Fu/p/7681787.html
Copyright © 2011-2022 走看看