C语言学习日记二

字符串和格式化输入输出

一.字符串简介

字符串(character string)是一个或多个字符的序列,例如"hello world!"
但值得注意的是双引号并不是字符串的一部分。它的作用仅仅是告诉编译器它括起来的是字符串,一如单引号标识单个字符

1. char类型数组和null字符

  • C语言没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中,数组是一片连续的存储单元,每个单元存储一个字符
helloworld!\0
  • 末尾的字符 \0
    这是空字符,C语言用它表示字符串的结束,非打印字符,ASCII码值为0。故20个存储单元的字符串,最多只能有19个字符,另一个给空字符,计算机自动添加空字符,不需要人为操作
  • 数组是同一类型的数组元素的有序序列,其中存储位置相邻
    定义含有40个存储单元的字符char name [40];

2.使用字符串

示例

/* praise1.c -- uses an assortment of strings */
#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打印字符串,其中 scanf()函数在遇到第一个空白(空格、制表符或换行符)时就不再读取输入

3. strlen() 函数

strlen() 函数给出字符串中的字符长度,若要使用这一函数则必须添加string.h这个头文件。特别注意的是 strlen() 函数不会计算空字符。
同样的也是用%zd打印,但是值得注意的是用 sizeof() 函数时会计入空字符

示例

/* praise2.c */
// try the %u or %lu specifiers if your implementation
// does not recognize the %zd specifier
#include <stdio.h>
#include <string.h>      /* provides strlen() prototype */
#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 %zd letters occupies %zd memory cells.\n",
           strlen(name), sizeof name);
    printf("The phrase of praise has %zd letters ",
           strlen(PRAISE));
    printf("and occupies %zd memory cells.\n", sizeof(PRAISE));
    
    return 0;
}

二、常量和C预处理器

#define NAME value
例如#define TAXRATE 0.015
编译程序时,程序中所有的TAXRATE都会被替换成0.015
不成文的规定是常量用大写字母表示
另外还可以定义字符和字符串

1. const限定符

用于限定一个变量为只读。声明如下:
const int MONTHS = 12;//类似于#define,但更灵活。

2. 明示常量

三、printf() 和 scanf()

1. printf() 函数

转换说明表

转换说明输出
%a或%A浮点数、十六进制数、p计数法
%c单个字符
%d有符号的十进制数
%e或%E浮点数,e计数法
%f浮点数,十进制计数法
%i同%d
%o无符号的八进制整数
%p指针
%s字符串
%u无符号十进制整数
%x或%X无符号的十六进制整数
%%打印一个%

printf() 的修饰符

修饰符含义
数字最小字段宽度 例如“%4d”
.数字精度
对于%e和%f而言,表示右边小数点的位数
对于%s而言表示待打印字符的最大数量
对于整数而言,表示待打印数字的最小位数,不够前面添加0
例如:“%5.2f”
h和整型转换一起使用,表示 short int 或 unsigned short int 类型的值
例如:“%hu”、“%hx”

printf() 的标记

标记含义
-待打印项左对齐
例如:“%-20s”
+符号值,若正,则值前显加号;反之,添负号
例如“%3.2f”
空格若值正,值前为空格;若值负,值前添负号
例如:“ % 6.2f”
#将结果表示为另一种形式,如若是%o格式,则以0开头;如若是%x,则以0x开头。
对于所有的浮点格式,即使后面没有数字也要打印小数点
例如“%#o”
0对于数值格式用前导0代替空格填充字段。对于整数格式,如出现-标记或指定精度,则忽略
例如:“%010d”
1. printf() 的返回值

若输出正确,它返回打印字符的个数(包括空格和不可见的换行符);
若输出有误,它返回一个负值;

2. 打印较长的字符串
  1. 使用多个printf() 语句;
  2. 使用(\)和Enter键组合来断行;
  3. 使用字符串连接;注意:“young”“lovers"会变成"younglovers"而"young” “lovers"才是"young lovers”,即字符串中必须包含空格;

2.使用scanf()函数

  • 读取基本变量类型的值,在变量名前加上一个&;
  • 把字符串读入字符数组中,不使用&;
  • scanf() 函数使用空白(换行符、制表符、空格)把输入分成多个字段
  • 唯一的例外是%c会读取所有的字符,包括空白

转换说明表

转换说明含义
%c把输入解释成字符
%d把输入解释成有符号的十进制数
%e、%f、%g、%a把输入解释成浮点数
%i把输入解释成有符号的十进制整数
%o把输入解释成有符号的八进制整数
%p把输入解释成 指针(地址)
%s把输入解释成字符串
%u把输入解释成无符号十进制整数
%x把输入解释成有符号的十六进制整数

转换说明中的修饰符

转换说明含义
*抑制赋值
例如: “%*d”
数字最大字段宽度。输入达到最大字段宽度处,或第一次遇到空白字符停止
例如:“%10s”
hh把整数当成signed char 或 unsigned char 类型读取
例如"%hhd"
ll把整数作为long long 或unsigned long long 类型读取
例如:“%lld”
h、l可以以此类推
1.格式字符串中的普通字符
  • scanf() 函数允许把普通字符放在格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配。
  • 除了%c,其他转换说明都会自动跳过待输入值前面的所有空白。
2. scanf()的返回值
  • scanf()函数返回成功读取的项数。若没有读取任何项,且读取错误时(需要数字却输入字符),scanf() 返回0。

四、一些补充

  • 在printf() 两个转换说明中间插入一个空白字符,可以确保即使一个数字即使溢出自己的字段,也不会挨着下一个数字一起输出。
  • printf() 函数可以用*修饰符来代替字段宽度 ,例如printf("The number is :%*d:\n",width,number)//width提供字段宽度,number是待打印的数字
  • scanf() 函数中的*,把*放在%和转换字符之间,会使得scanf()跳过相应的输出项。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值