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

本文介绍了C语言中字符串的存储方式,强调了字符数组末尾的空字符的重要性。此外,解释了strlen()函数用于计算字符串长度,以及sizeof()运算符的区别。还讨论了C预处理器的使用,如#define定义常量,以及printf()和scanf()函数的格式控制,包括字段宽度、精度和转换说明的应用。
摘要由CSDN通过智能技术生成

#include<stdio.h>

#include<string.h>//提供srelen()函数的原型

#define DENSITY 62.4//人体密度

int main(void)

{

float weight, volume;

int size, letters;

char name[40];//name是一个可以容纳40个字符的数组

printf("Hi! What is your first name?");

scanf("%s", name);

printf("%s, what is your weight in pounds?\n", name);

scanf("%f", &weight);

size = sizeof name;

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);

return 0;

}

①char类型数组和null字符


C语言没有专门用于储存字符串的变量类型,字符串都被储存再 char 类型的数组中。数组由连续的存储单元组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符。

字符数组的末尾为\0.这是空字符,空字符不是0,他是非打印字符,其ASKⅡ码值是(或等价于0).C语言用它标记字符串的结束,C中字符串一定以空字符结束。

字符数组容量一定要比待储存字符串中字符多1

#include<stdio.h>

#define PRAISE "You are an extraordinary being."

int main(void)

{

char name[40];

printf("What is your name?");

scanf("%s", name);

printf("Hello, %s, %s\n", name, PRAISE);

return;

}

注意:scanf() 如果输入姓名为 Vector Ye 那么只会读取 Vector,当他遇到第一个空白(空格, 制表符, 或者换行符)时就不在读取输入

一般而言根据 %s 转换说明,scanf()只会读取字符串中的一个单词,而不是一整句。

字符串和字符

区别之一在于 'x' 是基本类型char(),而"x"是派生类型(char数组);

区别之二是"x" 实际上是由两个字符组成:'x' 和 空字符 \0

②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", name, PRAISE);

printf("Your name of %zd letters occupies %zd memory cells.\n"

, strlen(name), sizeof (name));

printf("The phrase of praise has %zd leters", strlen(PRAISE));

printf("and occupies %zd memory cells.\n", sizeof PRAISE);

return 0;

}

strlen() 和 sizeof() 同样会得到字符串中的字符数,(包括空格和标点)。然而sizeof() 运算符给出的数更大,是因为他那字符串末尾不可见的空字符也计算在内。

<注意>该程序并没有明确告诉计算机要给字符串预留多大空间,因此他必须计算双引号内的字符数。

%zd 转换说明用于 sizeof() 和 strlen()

③常见C预处理器


使用符号常量可读性会更好,例如:

circleference = pi * diameter

circleference = 3.14159 * daimeter

在程序顶部加一行代码,定义一个常量:

#include<stdio.h>

#define AREA 0.25

int main(void)

{

... ...

return 0;

}

<注意格式>:

#define 常量名 符号常量的值

不加冒号,同时常量名应该大写(C语言规范)

#include<stdio.h>

#define PI 3.14159

int main(void)

{

float area;

float circum;

float radius;

printf("What is the radius of your pizza?\n");

scanf("%f", &radius);

area = PI * radius * radius;

circum = 2 * PI * radius;

printf("your parameters are as follows:\n");

printf("circumference = %1.2f, area = %1.2f.\n", circum, area);

return 0;

}

语句中的 %1.2f 表明,结果被四舍五入为两位小数输出。float默认输出为6位

其中1,为最小宽度最小宽度是表示输出的最少字符数。在C程序的printf()函数中,可以使用"%!N(MISSING)d"或"%!N(MISSING)f"格式化输出,其中N表示输出的最小宽度,若实际输出字符数不足N,则会在左侧用空格填充,直到输出字符数达到N为止。 如果实际输出字符数大于最小宽度,则最小宽度设置会被忽略。在C程序的printf()函数中,如果输出的字符数大于最小宽度,则不会在左侧用空格填充。

④const限定符


C90新增了const关键字,用于限定一个变量为只读,无法更改

const int MONTHS = 12;

⑤明示常量


C头文件limits.h 和 float.h 分别提供了与整数类型和浮点类型大小限制相关的详细信息。

⑥printf() 和 scanf()


printf()函数

(18条消息) c语言打印格式大全,C语言printf()输出格式大全_武耀峰的博客-CSDN博客 &📕P81页

转换说明修饰符:📕p83页

使用示例:

#include<stdio.h>

#define PAGES 959

int main(void)

{

printf("*%d*\n", PAGES);

printf("*%2d*\n", PAGES);

printf("*%10d*\n", PAGES);

printf("*%-10d*\n", PAGES);

return 0;

}

输出结果为:

浮点型使用示例:

#include<stdio.h>

int main(void)

{

const double RENT = 3852.99;//只读变量

printf("*%f*\n", RENT);

printf("*%e*\n", RENT);

printf("*%4.2f*\n", RENT);

printf("*%3.1f*\n", RENT);

printf("*%10.3f*\n", RENT);

printf("*%10.3E*\n", RENT);

printf("*%+4.2f*\n", RENT);

printf("*%010.2f*\n", RENT);

return 0;

}

输出结果为:

本例第一个转换说明是 %f。在这种情况下,字段宽度和小数点后面的位数均为默认系统设置,即字段宽度是容纳待打印数字所需的位数和小数点后打印6位数字。

字符串示例:

#include<stdio.h>

#define BLURB "Authentic imitation!"

int main(void)

{

printf("[%2s]\n", BLURB);

printf("[%24s]\n", BLURB);

printf("[%24.5s]\n", BLURB);

printf("[%-24.5s]\n", BLURB);

return 0;

}

输出:

转换说明的意义:

把二进制格式储存在计算机中的值转换成一系列字符(字符串)以便于显示。

实际上,转换说明是翻译说明

参数传递

计算机根据变量类型将值放入栈中,

printf()函数根据转换说名从栈中读取值。

printf()返回值

#include<stdio.h>

#define BLURB "Authentic imitation!"

int main(void)

{

int a = 212;

int rv;

rv = printf("%d F is water's boiling point.\n", a);

printf("The printf() function printed %d characters.\n", rv);

return 0;

}

第一个语句执行了两项任务,第一项为打印,第二项为赋值。

注意:计算针对所有字符数,包括空格和不可兼得换行符\n

打印较长的字符串

#include<stdio.h>

int main(void)

{

//①

printf("Here is one way to print a");

printf("long string\n");

//②

printf("Here is another way to print a \

long string\n");

//③

printf("Here is the newest way to print a "

"long string.\n");/*ANSI C*/

return 0;

}

方法一:使用多个printf()

方法二:使用反斜杠( \ ),和 Enter键组来断行

方法三:ANSI C引入的字符串连接,在两个用双引号括起来的字符串之间使用空白符隔开,C编译器会把多个字符串看成一个字符串

scanf()函数

scanf()要做的是将输入的字符串转换成整数,浮点数,字符或字符串。

和printf()函数的主要区别

在参数列表中,printf()函数使用变量,常量和表达式而scanf()函数使用指向变量的指针,记住以下两个规则:

①如果使用scanf()函数 读取基本变量类型的值,在变量名前加上一个&

②如果使用scanf()把字符串读入字符数组中,不要使用&

#include<stdio.h>

int main(void)

{

int age;

int assets;

char pet[30];

printf("Enter your age, assert, and favorite pet.\n");

scanf("%d %f", &age, &assets);

scanf("%s", pet);

printf("%d $ %.2f %s\n", age, assets, pet);

return 0;

}

从scanf()角度看输入

%s : scanf()会读取除空白以外的所有字符。scanf() 跳过跳过空白开始读取第一个非空白字符,并保存非空白字符直到再次遇到空白。

注意:当scanf() 将字符串放进指定数组时,他会在字符序列的末尾加上'\0',让数组中的内容称为一个C字符串

说明:

除了%c 其他转换说明都会自动跳过待输入值前面所有的空白。对于 %c 在格式字符串中添加一个空格字符会有所不同,例如:

如果将一个空格放到 %c 前面,scanf() 便会跳过空格,从第一个非空白字符开始读取,scanf("% c", &ch)

scanf()返回值

scanf()返回成功读取的橡树。如果没有读取任何项,且需要读取一个数字而非用户输入一个数值字符串,scanf()便返回0.

当scanf()检测到"文件结尾"时,会返回EOF.

printf() 和 scanf()的 * 修饰符

在printf()中:

#include<stdio.h>

int main(void)

{

unsigned width, precision;

int num = 256;

double weight = 242.5;

printf("Enter a field width:\n");

scanf("%d", &width);

printf("The number is : %*d:\n", width, num);

printf("Now, enter a width and a precision:\n");

scanf("%d %d", &width, &precision);

printf("Weight = %*f\n", width, precision, weight);

printf("Done\n");

return 0;

}

注意:变量 width 提供字段宽度,number 时待打印的数字。因为转换说明中 * 在d前面,所以在printf()参数列表中,width在 number前面。

在scanf()中:

#include<stdio.h>

int main(void)

{

int n;

printf("Please enter three integers:\n");

scanf("%*d %*d %d", &n);

printf("The last integer was %d\n", n);

return 0;

}

跳过两个整数,将第三个整数拷贝给n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Benaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值