2021-09-02 C语言学习第二天 (字符串)

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

本文主要学习以下内容:

  • 函数:strlen()
  • 关键字:const
  • 字符串
  • 如何创建、存储字符串
  • 如何使用strlen()函数获取字符串的长度
  • 用C预处理器指令#define和ANSIC的const修饰符创建符号常量

字符串简介

字符串是一个或多个字符的序列,使用双引号括起来。
如:

"hello world!"
  • char类型数组和null字符
    C语言没有专门用于存储字符串的变量类型,字符串都存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。
    注意:char类型的数组的最后一个储存位置的字符是\0,这是空字符(null),C语言用它标记字符串的结束,它不会被打印出来,ASCII值为0。
  • 字符串使用
/*praisel.c --使用不同类型的字符串 */
#include<stdio.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);
    return 0;
}

%s告诉printf()打印一个字符串。因为要打印两个,所以出现了两次,一个存储在name数组中,一个由PRAISE来表示。运行结果如下:

what's your name?Angela Plains
Hello, Angela. You are an extraordinary being.

我们并不需要把空字符放入字符串末尾,scanf()在读取输入时会自动完成这项工作。
根据%s转换说明,scanf()只会读取字符串中的一个单词,它会在遇到第一个空白时停止。
字符常量’x’是基本类型(char),而字符串常量"x"是派生类型(char数组);"x"由字符’x’和’\0’组成。

  • strlen()函数
    sizeof运算符会以字节为单位给出对象的大小。strlen()函数则会给出字符串中的字符长度。如果我们有一个40个存储单元的char数组,但是只有前11个单元用来储存了字符,那么strlen()的结果便是11,第12个是空字符,strlen()不计入,而sizeof得到的结果则会是40。

常量和C预处理器

  • #define预处理常量
    在程序中经常要使用常量,通过预处理器我们可以使用#define来定义常量,如:
#define TAXRATE 0.015

编译程序时,程序中的所有TAXRATE都会被替换成0.015,常量名通常全部大写,中间不需要等号,末尾不需要分号。

  • const限定符
    const关键字用于限定一个变量为只读。
const int MONTHS=12; //值在程序中不可更改

printf()和scanf()

  • printf()的转换说明和输出结果:
转换说明输出
%a(A)浮点数 、十六进制数和p计数法
%c单个字符
%d(i)有符号十进制整数
%f浮点数,十进制计数
%p指针
%s字符串
%%打印一个百分号
  • 使用scanf
    printf()函数使用的是变量 、常量 和表达式,而scanf()函数使用指向变量的指针。
    如果使用scanf()读取基本类型的值,在变量名前加上一个&;
    如果用scanf()把字符串读入字符数组中,不要使用&;
// input.c --何时使用&
#include<stdio.h>
int main(void)
{
    int age;
    float assets;
    char pet[30];
    printf("Enter your age,assets,and favorite pet.\n");
    scanf("%d %f",&age,&assets);
    scanf("%s",pet);
    printf("%d $%.2f %s\n",age,assets,pet);

    return 0;
}
Enter your age,assets,and favorite pet.
38
92360.88 llama
38 $92360.88 llama

scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。
**唯一的例外时%c转换说明,根据%c,scanf()会读取每个字符,包括空白。

  • ANSI C中scanf()的转换说明
转换说明含义
%c把输入解释成字符
%d(i)把输入解释成有符号十进制整数
%p把输入解释成指针(地址)
%s把输入解释成字符串。从第一个非空白字符开始,到下一个空白字符之前的所有字符都是输入

如果使用%s转换说明,scanf()会读取除空白字符以外的所有字符。这意味着scanf()读取一个单词。要注意当scanf()把字符串放入指定数组中时,它会在字符序列的末尾加上’\0’,让数组中的内容称为一个C字符串。
C语言还有其他的输入函数,如getchar()和fgets()。

  • 格式化字符串中的普通字符
    scanf()函数允许把普通字符放在格式字符串中。除空格字符外的普通字符必须与输入字符串严格匹配。例如,在两个转换说明中添加一个逗号:
scanf("%d,%d,&n,&m);

scanf()会将其解释成:用户将输入一个数字、一个逗号,然后再输入一个数字。也就是说,我们在输入时,必须这样输入两个整数:

88,121

当我们使用%c时,它可以读取空格,但是要注意,如果把%c放在空格前面,scanf()便会跳过空格,从第一个非空白字符开始读取。也就是说,scanf("%c",&ch)从输入中第一个字符开始读取,而scanf(" %c",&ch)则从第一个非空白字符开始读取。

  • scanf的返回值
    scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户输入的却是一个非数值字符串,scanf()便返回0。当scanf()检测到“文件结尾”时,会返回EOF,通常会用#define把EOF定义为-1。
  • printf()和scanf()的*修饰符
    printf()和scanf()都可以使用*修饰符来修改转换说明的含义。但是他们的用法不太一样。

在printf()中,如果你不想预先指定字段的宽度,希望通过程序来指定,可以使用 * 修饰符来代替字段宽度。但还是要一个参数来告诉函数,字段宽度应该是多少。

scanf("%*d",width,number);

在scanf()中,把*放在%和转换字符中间,会使得scanf()跳过相应的输出项。

/* skiptwo.c --跳过输入中的前两个整数 */
#include<stdio.h>
int main(void)
{
    int n;
    
    printf("Please enter three intergers:\n");
    scanf("%*d %*d %d",&n);
    printf("The lase interger was %d\n",n);

    return 0;
}
Please enter three intergers:
2013 2014 2015
The lase interger was 2015

scanf()在读取输入时会跳过非空白字符前的所有空白字符,然后一直读取字符,直到遇到空白字符或正在读取字符不匹配的字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值