C-study(四)

字符串

开始

#include <stdio.h>                               //提供printf(),scanf()函数原型
#include <string.h>                              //提供strlen()函数原型,和其他字符串相关函数
#define DENSITY 62.4                             // 预处理定义字符常量 人体密度
#define PRAISE "You are an extraordinary being." // 字符串常量

	float weight, volume;
    int size, letters;
    char name[40];
    /*[]表示数组,40表示数组元素数量,char表示类型;
    即40个字符的数组,占用内存中40个连续的字节,每个字节存一个字符值;
    最后一个字符是\0,占一个位置,所以只能放39个字符*/
    printf("Hi! What's your first name?\n");
    scanf("%s", name);
    /*使用%s表示字符串或者字符数组,
    输入字符串存储在数组中,单独数组名表示数组首地址,传入数组名不需要&前缀;
    遇到第一个空白、空格、制表符或换行符会停止读取输入,只会读取字符串中的第一个单词,不是一整句;
    fgets()同样可读取字符串*/
    printf("%s,what's your weight in pounds?\n", name); //%s输出字符串
    scanf("%f", &weight);
    size = sizeof(name);    // 返回数组占用字节数(数组长度),或者字符串常量字符数+1(空字符)
    letters = strlen(name); // 返回实际字符个数,不包括空字符
    volume = weight / DENSITY;
    printf("Well ,%s,your volume is %2.2f cubic feet.\n", name, volume);
    printf("Also,your first name has %d letters,\n", letters);
    printf("and we have %d bytes to store it.\n", size);

    printf("hello,%s.%s\n", name, PRAISE); // 字符串常量直接替换
    printf("Your name of %zd letters occupies %zd memory cells.\n",
           strlen(name), sizeof(name)); // 4(字符数),40(数组长度)参数之间可断为2行,字符串中间不可断开
    printf("The phrase of praise has %zd letters.\nand occupies %zd memory cells.\n",
           strlen(PRAISE), sizeof(PRAISE)); // 31(字符数),32(空字符),如果编译器识别不到zd 可替换成u 或 lu

字符串是一个或多个字符的序列
存储在char类型的数组中,由连续的存储单元组成,每个存储单元放一个char字符,空格也占一个存储单元。

\0空字符,标记字符串的结束,ASCII值为0,非打印字符
编译器自动在字符串末尾添加空字符,占一个存储单元,所以char数组长度>=字符数+1。

数组是同类型数据元素的连续有序序列

双引号表示字符串,单引号表示字符
字符常量 ‘x’ ->基本类型char
字符串常量 “x” ->派生类型char数组,包括’x’和\0两个字符

常量

符号常量
1、比数字表达更多信息
2、改变值时只需要改变符号常量的定义

预处理器处理的替换机制

#define TAXRATE 0.015 //编译时替换,明示常量,只做替换,不做类型检查

#define 符号常量名 符号常量值

中间不需要等号,末尾不需要分号,一般符号常量名使用全大写,便于识别
命名规则:大小写,数字和下划线,首字母不能用数字

const 限定符 只读变量
limits.h float.h提供了与整数类型和浮点类型大小限制相关的详细信息

limits.h floats.h
在这里插入图片描述在这里插入图片描述

#include <limits.h>
/*包含  #define INT_MAX +32767
        #define INT_MIN -32767 //int类型可表示的最大最小值*/
#include <float.h> //提供了与整数类型和浮点类型大小限制相关的详细信息
#define PI 3.14159
#define BEEP '\a' // 定义字符常量 ''
#define TEE 'T'
#define ESC '\033'
#define OOPS "Now you have done it!" // 定义字符串常量 ""
// #define TOES =20 错误的格式 替换为 =20

   	const int MONTHS = 12; // const限定符声明可读不可写的变量
   
    float area, circum, radius;
    printf("What is the radius of your pizza?\n");
    scanf("%f", &radius);
    area = PI * radius * radius;
    circum = 2.0 * PI * radius;
    printf("You basic pizza parameters are as follows:\n");
    printf("circumference = %1.2f,area = %1.2f\n", circum, area); // 四舍五入为两位小数输出

    printf("Biggest int :%d\n", INT_MAX);
    printf("Smallest long long int :%lld\n", LLONG_MIN);
    printf("One byte = %d bits on this system\n", CHAR_BIT);
    printf("Largest double:%e\n", DBL_MAX);
    printf("Smallest normal float:%e\n", FLT_MIN);
    printf("Float precision = %d difits\n", FLT_DIG);
    printf("Float epsilon = %e\n", FLT_EPSILON);

stdio.h

printf

print(“格式字符串”,待打印项1,待打印项2,…);

格式字符串包含实际打印的字符串、每个待打印项的转换说明;
待打印项是变量,常量,可计算的表达式的值;
每个参数之间可以有空格和换行;
格式化字符串中不可有换行,只能有\n表示换行;

转换说明必须和待打印项的个数和类型匹配;

转换说明

转换说明即翻译说明:%d->把给定的值翻译为10进制整数文本打印出来;

没有float类型的转换说明(%f ?),printf函数中,表达式或参数中的float类型值会被自动转换为double类型
在这里插入图片描述

在%和转换字符之间插入修饰符和标记可修饰基本的转换说明

%.f和%.0f相同,不要小数部分

sizeof字节为单位返回类型或值的大小,系统规定为无符号整数,可能是%u,%lu,%llu。

stdio.h(其中包括的stddef.h )把size_t定义成系统使用sizeof返回的类型,被称为底层类型,使用z修饰表示打印相对的类型。

定义ptrdiff_t类型和t修饰符来表示系统使用的两个地址差值的底层有符号整数类型。

使用足够大的字段宽度可以使输出整齐美观,指定固定字段宽度把数据打印成列;
在两个转换说明中加一个空格,可以保证数字溢出自己的字段,两个数字之间也有间隔;
在文字中嵌入一个数字,指定一个小于或等于该数字宽度的字段宽度,就没有不必要空白;
在这里插入图片描述在这里插入图片描述转换说明和待打印值不匹配时,打印出来的值非期待结果;
待打印值参数传递:会根据变量类型把值放入中,函数根据转换说明从栈中取值,两者不匹配时会取错字节
在这里插入图片描述

#define PI 3.141593
#define PAGES 959
#define BLURB "Authentic imitation"
#define WORDS 65618
  	int number = 7;
    float pies = 12.75;
    int cost = 7800;
    int pc = 2 * 6;
    const double RENT = 3852.99;//const只读

    printf("The %d contestants are %f berry pies,\n", number, pies); //%d,整形
    printf("The value of pi is %f.\n", PI);                          //%f,浮点数
    printf("Farewell! thou art too dear for my possessing,\n");
    printf("%c%d\n", '$',2 * cost);                           //%c单个字符,表达式也可作为待打印项,先计算,再打印出表达式的值
    printf("Only %d%% of Sally's gribbles were edible.\n", pc); // 两个%,打印出来%

    printf("*%d*\n", PAGES);
    printf("*%2d*\n", PAGES);   // 2字段宽度,待打印整数,自动扩大以符合整数的长度
    printf("*%10d*\n", PAGES);  // 10字段宽度,7个空格和3个数字,右对齐不需要特殊符号
    printf("*%-10d*\n", PAGES); // 10字段宽度,7个空格和3个数字,-号表示左对齐

    printf("*%f*\n", RENT);      // 十进制记数法,默认打印小数点后6位,不足6位填0
    printf("*%e*\n", RENT);      // e记数法,默认小数点前1位,小数点后6位,不足6位填0
    printf("*%4.2f*\n", RENT);   // 整个数字占4位字段宽度,不足自动扩充,小数点后2位
    printf("*%3.1f*\n", RENT);   // 小数点后一位,四舍五入
    printf("*%10.3f*\n", RENT);  // 整个数字占10位字段宽度,右对齐,不足空格填充,小数点后3位,不足填0
    printf("*%10.3E*\n", RENT);  // e记数法,输出E
    printf("*%+4.2f*\n", RENT);  //+ 表示显示+/-符号
    printf("*%010.2f*\n", RENT); // 0表示不足0填充,整个数字占10位字段宽度,右对齐,

    printf("%x,%X,%#x\n", 31, 31, 31);         // 小写的16进制数,大写的16进制数,带0x前缀的16进制数
    printf("**%d**% d**% d**\n", 42, 42, -42); // % d,数字前导空格,负值前面不产生前导空格
    printf("**%5d**%5.3d**%05d**%05.3**\n", 6,6,6,6);
    /*5表示5个字段宽度,不足填空格;
    .3表示最小位数,不足填0;
    0不足填0,5表示5个字段宽度;
    05.3,0和精度一起出现,0忽略*/

    printf("[%2s]\n", BLURB);     // 2个字段,自动扩大
    printf("[%24s]\n", BLURB);    // 24个字段,右对齐,不足填空格
    printf("[%24.5s]\n", BLURB);  //.5只打印5个字符
    printf("[%-24.5s]\n", BLURB); //-:左对齐

    /*不匹配的类型转换*/
    short num = PAGES;
    short mnum = -PAGES;
    printf("num as short and unsigned short:%hd %hu\n", num, num);           // 正short用'有符号short类型','无符号short类型'均可正常显示
    printf("num as short and unsigned short:%hd %hu\n", mnum, mnum);         // 负short可用'有符号short类型',不可用'无符号short类型',二进制补码
    printf("num as int and char:%d %c\n", num, num);                         // 有符号整型可正常显示,char类型超出范围,会除256取余
    printf("WORDS as int ,short and char:%d %hd %c\n", WORDS, WORDS, WORDS); // 有符号整型可正常显示,有符号short类型超出范围,只使用最后两个字节,除65536取余,char类型超出范围,会除256取余

    float n1 = 3.0;//%f,%e,%le
    double n2 = 3.0;
    long n3 = 2000000000;
    long n4 = 1234567890;
    printf("%.le %.le %.le %.le\n", n1, n2, n3, n4); // 后面两个类型错误,对于4字节的n3会取相邻4字节凑够8字节的double类型
    printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);     // 前面两个类型错误,取字节错误,所有的数据都会错
    printf("%ld %ld\n", n3, n4);

返回值

sqrt():返回参数的平方根给主调程序
printf():返回打印字符的个数(格式化字符串的字符数,包括""内的所有字符,包括空格和换行符),输出错误时返回负数,在写入文件时常用来检测输出错误

int bph2o = 212;
int rv;
rv = printf("%d F is water's boiling point.\n", bph2o);//返回值赋值给rv
printf("The printf() function printed %d characters.\n",
       rv); // 双引号之间不可以有换行,,编译器会忽略空白

长语句打印

printf("Here's one way to print a");
printf("long string.\n"); // 第一种方法不带\n打在同一行
printf("Here's another way to print a \
 long string.\n");             // 第二种方法,用 \ 和enter换行,光标移至下一行,从最左边开始输出,第二行首空格会包含在字符串内
printf("Here's the newest way to print a "
       "long string.\n"); // ANSI C 引入第三种方法,用空格隔开的多个双引号括起来的字符串看作是一个字符串,在字符串中需要包含所需的空格,打出来还是一行

scanf

通用输入函数,读取输入的字符串转化为整数,浮点数,字符或字符串等不同格式数据

scanf(“格式化字符串”,参数列表);
格式化字符串表示字符输入流的目标数据类型
参数列表是指向变量的指针
读取基本变量类型的值,加&
字符串读入字符数组,不用&

空白:空格、空行,制表符
使用空白把输入分成多个字段
把转换说明和字段匹配时会跳过空白
通常输入时每个输入项之间至少一个空白
格式化字符串中除空格字符以外的普通字符必须与输入字符串严格匹配

%c会读取每个字符包括空白

%s跳过空白,从第一个非空白字符开始读取并保存,遇到第一个空白字符字段末尾停止,加上’\0’保存为字符串;即只读取第一个单词

%d :跳过空白,从第一个数字符号或者正负符号开始读取并保存,遇到非数字符号字段结尾停止;

如果读取到的第一个非空白字符和类型不匹配,则停止读取输入

返回值:返回读取成功的字符数,不包括’\0‘
没有读取任何项,返回0
检测到文件结尾,返回EOF(stdio.h中#define 为-1)

printf和scanf的区别
%f,%e,%E,%g,%G,printf包括float和double
scanf只用于float,对于double需要使用l修饰
在这里插入图片描述
在这里插入图片描述

int age;      // 变量
float assets; // 变量
char pet[30]; // 字符数组,用于储存字符串
char ch;      // 字符变量
printf("Enter your age, assets, and favorite pet.\n");

scanf("%d %f", &age, &assets); // 这里要使用&,空格分隔输入字段,两个输入之间至少有一个空白(空格,换行,制表)
printf("age %d assets %f\n", age, assets);

scanf("%d,%f", &age, &assets); // 输入时也必须有,
printf("age %d assets %f\n", age, assets);

// scanf("%c", &ch);           // 从输入的第一个字符开始读取,包括空白,此处会包含上一次输入的换行符
// printf("ch %c\n", ch);
scanf(" %c", &ch);             // 从第一个非空格字符开始读取
printf("ch %c\n", ch);
scanf("%s", pet);              // 字符数组不使用&
printf("pet %s\n",  pet);

在这里插入图片描述

*修饰符

printf:不想预先指定字段宽度,修饰符代替,指代一个参数
scanf:把
放在%和转换字符之间,会跳过相应输出项

unsigned width, precision;
int number = 256;
double weight = 242.5;
printf("Enter a field width:\n");
scanf("%d", &width);
printf("The number is :%*d:\n", width, number); // width 提供字段宽度 %6d,num是待打印数字
printf("Now enter a width and a precision:\n");
scanf("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight); // width,precision提供格式化信息 %8.3d
printf("Done!\n");

int n;
printf("Please enter three integers:\n");
scanf("%*d %*d %d", &n); // 跳过前两个,把第三个赋值给n
printf("The last integer was %d\n",n);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值