C语言初学者笔记(字符串与格式化输出)|“朝闻道”知识分享大赛

2301_80948168 2024-10-28 22:45:17

这是我参加朝闻道知识分享大赛的第三篇文章


C语言字符串与格式化输出入门版——学生笔记版

目录

C语言字符串与格式化输出入门版——学生笔记版

一、字符串的奥秘

1. 字符串的定义与初始化

2. 字符串的操作函数

3. 字符串的输入输出

二、格式化输出的艺术

1. 基本格式说明符

2. 宽度与精度

3. 标志

4. 其他格式说明符


一、字符串的奥秘

1. 字符串的定义与初始化

字符串在C语言中实际上是一个字符数组,以空字符'\0'作为结束标志。这种设计使得C语言能够高效地处理字符串,同时也要求我们在使用字符串时格外小心,以避免越界访问等潜在问题。

  • 字符数组方式

    char str[11] = "Hello, World!"; // 数组大小为11,包含末尾的空字符'\0'

    这种方式是字符串定义方式,允许我们对字符串进行修改。但需要注意的是,数组的大小必须足够容纳字符串及其结束符'\0'

  • 指针方式(只读):

    const char *ptr = "Hello, World!";

    使用指针方式定义的字符串通常是只读的,因为字符串常量存储在程序的只读数据段中。如果尝试修改这样的字符串,将会导致未定义行为。

2. 字符串的操作函数

C语言标准库提供了一系列用于操作字符串的函数,这些函数定义在<string.h>头文件中。

  • 长度计算strlen函数用于计算字符串的长度(不包括结束符'\0')。

    char str[] = "Hello, World!"; 
    size_t len = strlen(str); // len = 13

     

  • 拼接strcat函数用于将两个字符串拼接在一起。

    char str1[50] = "Hello"; 
    char str2[] = ", World!"; 
    strcat(str1, str2); // str1 = "Hello, World!"

    需要注意的是,目标字符串必须有足够的空间来容纳拼接后的结果。

  • 复制strcpy函数用于将一个字符串复制到另一个字符串中。

    char dest[50]; 
    char src[] = "Copy me!"; 
    strcpy(dest, src); // dest = "Copy me!"
    
    同样,目标字符串必须有足够的空间来容纳源字符串。
    
  • 比较strcmp函数用于比较两个字符串的大小。

    char str1[] = "Apple"; 
    char str2[] = "Banana"; 
    int result = strcmp(str1, str2); // result < 0 表示str1小于str2

    strcmp函数按照字符的ASCII码值进行比较,如果第一个不匹配的字符在str1中的ASCII码值小于str2中的ASCII码值,则返回负值;如果大于,则返回正值;如果相等,则继续比较下一个字符,直到找到不匹配的字符或字符串结束。

  • 其他操作:C语言标准库还提供了许多其他字符串操作函数,如strchr(查找字符)、strstr(查找子串)、sprintf(格式化字符串到数组)等。

3. 字符串的输入输出

在C语言中,字符串的输入输出通常使用scanfprintf函数。

  • 输入:使用scanf函数读取字符串时,需要注意缓冲区溢出的问题。由于scanf使用%s格式说明符读取字符串时不会检查目标数组的大小,因此很容易发生缓冲区溢出。为了避免这个问题,可以使用%ns格式说明符来限制读取的字符数(其中n是目标数组的大小减一,以留出空间给结束符'\0')。

    char str[50]; 
    printf("Enter a string: "); 
    scanf("%49s", str); // 读取最多49个字符,留出一个字符给'\0'


    另外,还可以使用fgets函数来安全地读取字符串,它会读取直到遇到换行符或达到指定的字符数限制(包括换行符),并将换行符存储在目标数组中(如果空间允许)。

  • 输出:使用printf函数输出字符串时,只需使用%s格式说明符即可。

    char str[] = "Hello, World!"; 
    printf("%s\n", str);

二、格式化输出的艺术

在C语言中,printf函数是格式化输出的核心。它允许我们按照指定的格式将不同类型的数据输出到控制台或文件中。接下来,我们将深入探讨printf函数的格式说明符及其使用技巧。

1. 基本格式说明符

  • 整数:使用%d%i格式说明符输出整数。

    
    	int num = 100; 
    
    	printf("%d\n", num); // 输出:100
  • 浮点数:使用%f格式说明符输出浮点数(默认保留6位小数)。

    float pi = 3.14159; 
    printf("%f\n", pi); // 输出:3.141590

    可以使用.n的形式来指定小数点后的位数(n为精度)。

  • 字符:使用%c格式说明符输出单个字符。

    char ch = 'A'; 
    printf("%c\n", ch); // 输出:A

     

  • 字符串:使用%s格式说明符输出字符串。

    char str[] = "Hello"; 
    printf("%s\n", str); // 输出:Hello

2. 宽度与精度

  • 宽度:指定输出字符的最小宽度。如果实际字符数少于指定宽度,则使用空格进行填充。

    int num = 10; 
    printf("%5d\n", num); // 输出: 10 (前面有3个空格)

    可以使用-标志来指定左对齐。

  • 精度:对于浮点数,指定小数点后的位数。

    float pi = 3.14159; 
    printf("%.2f\n", pi); // 输出:3.14

    对于整数,精度指定了最小宽度(如果宽度未指定)或最大宽度(如果宽度和精度都指定了)。

3. 标志

  • -:左对齐输出。

    
    	int num = 10; 
    
    	printf("%-5d\n", num); // 输出:10 (数字右侧有3个空格)
  • +:输出正数时带加号。

    int num = 10; 
    printf("%+d\n", num); // 输出:+10

    0:用0填充宽度(仅当宽度指定时有效)。

  • int num = 10; 
    printf("%05d\n", num); // 输出:00010
  • #:对于浮点数,强制输出小数点和小数部分(即使为零);对于整数,如果基数不是10,则前缀0x或0X(对于十六进制)或0(对于八进制)。

  • (空格):对于正数,在数字前加一个空格(仅当+标志未指定时有效)。

4. 其他格式说明符

  • 十六进制:使用%x%X格式说明符输出无符号整数的十六进制表示(小写/大写)。

    int num = 255; 
    printf("%x\n", num); // 输出:ff 
    printf("%X\n", num); // 输出:FF

    可以使用#标志来添加前缀0x0X

  • 八进制:使用%o格式说明符输出无符号整数的八进制表示。

    int num = 8; 
    printf("%o\n", num); // 输出:10

    同样,可以使用#标志来添加前缀0

  • 指针:使用%p格式说明符输出指针的值(通常以十六进制表示)。
int *ptr = &num; 
printf("%p\n", (void *)ptr); // 输出指针的值(注意类型转换)
  • 百分号:要输出百分号字符本身,请使用%%格式说明符。
  • printf("Percentage sign: %%\n"); // 输出:Percentage sign: %

    5. 宽度与精度的组合使用

在实际应用中,我们经常会将宽度与精度组合使用来精确控制输出的格式。

  • 指定宽度和精度
    
    	float pi = 3.14159; 
    
    	printf("%7

     

...全文
111 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧