• C语言-字符串与输入输出


    一、字符串

    1、字符串简介

    在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

    空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。

    比如:下面声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词 RUNOOB 的字符数多一个。

    char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    
    # 依据数组初始化规则,您可以把上面的语句写成以下语句:
    char site[] = "RUNOOB";
    
    • 1
    • 2
    • 3
    • 4

    以下是 C/C++ 中定义的字符串的内存表示:

    在这里插入图片描述

    其实,您不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。

    #include 
    
    int main() {
        char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    
        char str1[7] = "runoob";
        printf("菜鸟教程: site=%s\n", site); // 菜鸟教程: site=RUNOOB
        printf("菜鸟教程: str1=%s\n", str1); // 菜鸟教程: str1=runoob
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、字符串相关的函数

    C 语言中的标准库可以找到大量操作字符串相关的函数,比如:

    在这里插入图片描述

    示例如下:

    #include 
    #include 
    
    int main() {
        char str1[14] = "runoob";
        char str2[14] = "google";
        char str3[14];
        int len;
    
        /* 复制 str1 到 str3 */
        strcpy(str3, str1);
        printf("strcpy( str3, str1) :  %s\n", str3);
    
        /* 连接 str1 和 str2 */
        strcat(str1, str2);
        printf("strcat( str1, str2):   %s\n", str1);
    
        /* 连接后,str1 的总长度 */
        len = strlen(str1);
        printf("strlen(str1) :  %d\n", len);
        
        printf("str1= %s\n", str1);
        printf("str2= %s\n", str2);
        printf("str3= %s\n", str3);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    二、输入输出

    输入输出(Input and Output, IO)是用户和程序“交流”的过程。在控制台程序中,输出一般是指将数据(包括数字、字符等)显示在屏幕上,输入一般是指获取用户在键盘上输入的数据。

    在C语言中,有多个函数可以用来在显示器上输出数据,它们分别是:

    • printf():可以输出各种类型的数据。
    • puts():只能输出字符串,并且输出结束后会自动换行。
    • putchar():只能输出单个字符。

    C语言有多个函数可以从键盘获得用户输入,它们分别是:

    • scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
    • getchar()、getche()、getch():这三个函数都用于输入单个字符。
    • gets():获取一行数据,并作为字符串处理。

    C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数,在 “stdio.h” 头文件中声明。重点掌握。

    • scanf() 函数用于从标准输入(键盘)读取并格式化。
    • printf() 函数发送格式化输出到标准输出(屏幕),printf() 函数在 “stdio.h” 头文件中声明。。

    1、字符输入输出

    getchar() & putchar() 函数,需要添加"stdio.h" 头文件:

    • int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
    • int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

    示例如下:

    #include 
    
    int main() {
        int c;
    
        printf("Enter a value :");
        c = getchar();
    
        printf("\nYou entered: ");
        putchar(c);
        printf("\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、字符串输入输出

    gets() & puts() 函数,需要添加"stdio.h" 头文件:

    • char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
    • int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。

    示例如下:

    #include 
    
    int main( )
    {
        char str[100];
    
        printf( "Enter a str :");
        gets( str );
    
        printf( "\nYou entered: ");
        puts( str );
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    当上面的代码被编译和执行时,它会等待您输入一些文本,当您输入一个文本并按下回车键时,程序会读取一整行直到该行结束。

    3、格式化输入输出

    scanf() 和 printf() 函数,需要添加"stdio.h" 头文件:

    • int scanf(const char *format, …) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
    • int printf(const char *format, …) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。

    format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。

    3.1 printf() 函数

    printf() 函数是最灵活、最复杂、最常用的输出函数,完全可以替代 puts() 和 putchar()。

    基本语法:printf(格式控制, 输出列表);

    printf() 函数的格式控制符:

    在这里插入图片描述

    printf() 格式控制符的完整形式如下:

    %[flag][width][.precision]type
    [ ] 表示此处的内容可有可无,是可以省略的。

    (1) type 表示输出类型,比如 %d、%f、%c、%lf,type 就分别对应 d、f、c、lf;再如,%-9d中 type 对应 d。
    type 这一项必须有,这意味着输出时必须要知道是什么类型。

    (2) width 表示最小输出宽度,也就是至少占用几个字符的位置;例如,%-9d中 width 对应 9,表示输出结果最少占用 9 个字符的宽度。
    当输出结果的宽度不足 width 时,以空格补齐(如果没有指定对齐方式,默认会在左边补齐空格);当输出结果的宽度超过 width 时,width 不再起作用,按照数据本身的宽度来输出。

    (3) .precision 表示输出精度,也就是小数的位数。

    • 当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
    • 当小数部分的位数小于 precision 时,会在后面补 0。
      另外,.precision 也可以用于整数和字符串,但是功能却是相反的:
    • 用于整数时,.precision 表示最小输出宽度。与 width 不同的是,整数的宽度不足时会在左边补 0,而不是补空格。
    • 用于字符串时,.precision 表示最大输出宽度,或者说截取字符串。当字符串的长度大于 precision 时,会截掉多余的字符;当字符串的长度小于 precision 时,.precision 就不再起作用。

    示例如下:

    #include 
    
    int main() {
    
        int a1 = 20, a2 = 345, a3 = 700, a4 = 22;
        int b1 = 56720, b2 = 9999, b3 = 20098, b4 = 2;
        printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
        printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
        printf("%9d %9d %9d %9d\n", b1, b2, b3, b4);
        // %-9d中,d表示以十进制输出,9表示最少占9个字符的宽度,宽度不足以空格补齐,-表示左对齐(如果没有指定对齐方式,默认会在左边补齐空格)。
        printf("=============\n");
    
        /*
         对输出结果的说明:
            对于 n,.precision 表示最小输出宽度。n 本身的宽度为 6,当 precision 为 9 时,大于 6,要在 n 的前面补 3 个 0;当 precision 为 4 时,小于 6,不再起作用。
            对于 f,.precision 表示输出精度。f 的小数部分有 6 位数字,当 precision 为 2 或者 4 时,都小于 6,要按照四舍五入的原则截断小数;当 precision 为 10 时,大于 6,要在小数的后面补四个 0。
            对于 str,.precision 表示最大输出宽度。str 本身的宽度为 9,当 precision 为 5 时,小于 9,要截取 str 的前 5 个字符;当 precision 为 15 时,大于 9,不再起作用。
         */
        int n = 123456;
        double f = 882.923672;
        char *str = "abcdefghi";
        printf("n: %.9d  %.4d\n", n, n);
        printf("f: %.2lf  %.4lf  %.10lf\n", f, f, f);
        printf("str: %.5s  %.15s\n", str, str);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    flag 是标志字符。例如,%#x中 flag 对应 #,%-9d中 flags 对应-。下表列出了 printf() 可以用的 flag:

    在这里插入图片描述

    #include 
    
    int main() {
        int m = 192, n = -943;
        float f = 84.342;
        printf("m=%10d, m=%-10d\n", m, m);  //演示 - 的用法
        printf("m=%+d, n=%+d\n", m, n);  //演示 + 的用法
        printf("m=% d, n=% d\n", m, n);  //演示空格的用法
        printf("f=%.0f, f=%#.0f\n", f, f);  //演示#的用法
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    对输出结果的说明:

    • 当以%10d输出 m 时,是右对齐,所以在 192 前面补七个空格;当以%-10d输出 m 时,是左对齐,所以在 192 后面补七个空格。
    • m 是正数,以%+d输出时要带上正号;n 是负数,以%+d输出时要带上负号。
    • m 是正数,以% d输出时要在前面加空格;n 是负数,以% d输出时要在前面加负号。
    • %.0f表示保留 0 位小数,也就是只输出整数部分,不输出小数部分。默认情况下,这种输出形式是不带小数点的,但是如果有了#标志,那么就要在整数的后面“硬加上”一个小数点,以和纯整数区分开。

    3.2 scanf() 函数

    scanf() 函数是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数。

    基本语法:scanf(格式控制, 地址列表);

    scanf() 函数的格式控制符:

    在这里插入图片描述
    示例如下:

    #include 
    
    int main() {
        char letter;
        int age;
        char url[30];
        float price;
    
        scanf("%c", &letter);
        scanf("%d", &age);
        scanf("%s", url); //可以加&也可以不加&
        scanf("%f", &price);
    
        printf("字符 letter = %c。\n", letter);
        printf("整数 c = %d,url = %s,小数 price = %g。\n", age, url, price);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    实例1:

    #include 
    
    int main() {
        float height, weight;
        double BMI;
    
        printf("请输入你的身高和体重:");
        scanf("%f %f", &height, &weight); // 空格分隔,回车
    
        BMI = weight / (height * height);
        printf("你的身体质量指数(BMI)为: %f。\n", BMI);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    实例2:

    #include 
    
    int main() {
        int loc, ser;
    
        printf("请输入你的工位号:");
        scanf("%d", &loc); //回车
        printf("\n请输入你的密码:");
        scanf("%d", &ser); //回车
    
        if (loc == 123 && ser == 123456) {
            printf("\n已签到(%d),谢谢", loc);
        } else {
            printf("\n对不起,工位号或者密码有误!");
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    – 求知若饥,虚心若愚。

  • 相关阅读:
    GPT learning
    深入理解注解驱动配置与XML配置的融合与区别
    【vue+nestjs】gitee第三方授权登录【超详细】
    报表技术POI导入导出复杂样式Excel和百万数据(Java代码、模板、数据)
    EdgeMoE: Fast On-Device Inference of MoE-based Large Language Models
    跑得“快”还要走得“稳”,看头部车企数字化实践怎么做
    Ubuntu20.0中安装Gradle
    深入浅出:npm常用命令详解与实践
    Python开发工具
    10种有用的Linux Bash_Completion 命令示例
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/133608991