字符串和格式化输入/输出

本文参考C Primer Plus进行C语言学习

文章目录

  • strlen()函数
  • sizeof
  • 使用数据类型


1.strlen()函数

        之前提到的sizeof运算符它以字节为单位给出对象的大小。strlen()函数给出字符串中的字符长度。

#include<stdio.h>
#include<string.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
	char name[40];
	printf("What's your name?");
	scanf("%s",name);
	printf("Hello,%s. %s\n",name,PRAISE);
	printf("Your name of %u letters occupies %u memory cells.\n",strlen(name),sizeof name);
	printf("The phrase of praise has %u letters ",strlen(PRAISE));
	printf("and occupies %u memory cells.\n",sizeof PRAISE);

	return 0;
}

运行结果: 

        sizeof运算符报告,name数组有40个存储单元。但是,只有前4个单元用来存储Wang,所以strlen()得出的结果是4。name数组的第5个单元储存空字符,strlen()并未将其计入。

strlen()函数知道在何处停止

        对于PRAISE,用 strlen()得出的也是字符串中的字符数(包括空格和标点符号)。然而,sizeof运算符给出的数更大,因为它把字符串末尾不可见的空字符也计算在内。该程序并未明确告诉计算机要给字符串预留多少空间,所以它必须计算双引号内的字符数。

         C99 和CI1 标准专门为 sizeof 运算符的返回类型添加了zd转换说明,这对于strlen()同样适用对于早期的C,还要知道sizeof 和 strlen()返回的实际类型(通常是unsigned或unsigned long)。

          另外,还要注意一点:上一章的 sizeof 使用了圆括号,但本例没有。圆括号的使用时机否取决于运算对象是类型还是特定量?运算对象是类型时,圆括号必不可少,但是对于特定量,可有可无。也就是说,对于类型,应写成 sizeof(char)或 sizeof(float);对于特定量,可写成 sizeof name或sizeof 6.28。尽管如此,还是建议所有情况下都使用圆括号,如sizeof(6.28)。

        使用 strlen()和 sizeof,完全是为了满足读者的好奇心。在实际应用中,strlen()和 sizeof 是非常重要的编程工具。例如,在各种要处理字符串的程序中,strlen()很有用。

2.类型大小(sizeof)

        如何知道当前系统指定类型的大小?

#include<stdio.h>
int main(void)
{
	printf("Type int has a size of %u bytes.\n",sizeof(int));
	printf("Type char has a size of %u bytes.\n",sizeof(char));
	printf("Type long has a size of %u bytes.\n",sizeof(long));
	printf("Type double has a size of %u bytes.\n",sizeof(double));
	printf("Type long double has a size of %u bytes.\n",sizeof(long double));
	return 0;
}

sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。C99和C11提供%zd 转换说明sizeof的返回类型。一些不支持C99和C11的编译器用%u或%1u或代替%zd。

3.使用数据类型 

        编写程序时,应注意合理选择所需的变量及其类型。通常,用int或float类型表示数字,char类型表示字符。在使用变量之前必须先声明,并选择有意义的变量名。初始化变量应使用与变量类型匹配的常数类型。例如:
int apples= 3;        /* 正确 */
int oranges =3.0;        /* 不好的形式 */
        与Pascal 相比,C在检查类型匹配方面不太严格。C编译器甚至允许二次初始化,但在激活了较高级别警告时,会给出警告。最好不要养成这样的习惯。
        把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部
分数据丢失。例如,下面的初始化:
int cost = 12.99;        /*用double 类型的值初始化 int 类型的变量*/
float pi = 3.1415926536;         /* 用 double 类型的值初始化 float 类型的变量*/
        第1个声明,cost的值是12。C编译器把浮点数转换成整数时,会直接丢弃(截断)小数部分,而不进行四舍五入。第2个声明会损失一些精度,因为C只保证了 float 类型前6位的精度。编译器对这样的初始化可能给出警告。读者在编译程序清单3.1时可能就遇到了这种警告。

        许多程序员和公司内部都有系统化的命名约定,在变量名中体现其类型。例如,用i_前缀表示int类型,us_前缀表示unsigned short 类型。这样,一眼就能看出来i_smart是int 类型的变量us_versmart 是unsigned short 类型的变量。
        

相关推荐

  1. 【C语言】格式化输入/输出

    2024-01-27 18:58:01       21 阅读
  2. uniapp实现时间格式化输出友好时间输出

    2024-01-27 18:58:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 18:58:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 18:58:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 18:58:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 18:58:01       18 阅读

热门阅读

  1. spring自动配置的原理

    2024-01-27 18:58:01       32 阅读
  2. 【重点问题】攻击面发现及管理

    2024-01-27 18:58:01       34 阅读
  3. 深度学习在医学影像分析中的应用

    2024-01-27 18:58:01       36 阅读
  4. 11Docker数据持久化

    2024-01-27 18:58:01       33 阅读
  5. docker运行nginx不生效

    2024-01-27 18:58:01       36 阅读
  6. Golang协程池ants使用笔记

    2024-01-27 18:58:01       37 阅读
  7. Vue3 封装Tree树形组件,且只支持单选

    2024-01-27 18:58:01       28 阅读
  8. 开发嵌入式Linux应用程序框架-QT的初步了解

    2024-01-27 18:58:01       30 阅读
  9. Python 有用的库&模块

    2024-01-27 18:58:01       26 阅读
  10. yaml学习笔记

    2024-01-27 18:58:01       28 阅读
  11. 使用Excel计算--任务完成总工作日时间段

    2024-01-27 18:58:01       45 阅读