第四章_字符串和格式化输入输出

第四章 字符串和格式化输入输出

  1. 使用字符数组(array)储存字符串
// 示例程序
#include <stdio.h>
#include <string.h> //提供strlen()函数的原型
int main() {
    char name[50];
    printf("输入名字\n");
    scanf("%s", name);
    printf("你的名字是:%s\n", name);

    //sizeof查看容量
    int size = sizeof name;
    printf("数组容量size:%d\n", size);

    //string.h中的strlen()函数,查看字符串长度
    printf("字符串长度为%ld\n", strlen(name));
}
  • 用字符数组(array)储存字符串,该数组在内存中占用连续的50个字节,每个字节存储一个字符。
  • 使用 %s 做为输入输出的占位符,注意,在scanf中,name变量没有&前缀,而数字类型的变量有。
  • 使用 string.h 中的 strlen() 函数获取字符串长度。
// 运行结果
输入名字
sunjian
你的名字是:sunjian
数组容量size:50
字符串长度为7
  1. 字符串简介

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

​ 注意字符串最后一位的 \0 ,这是C语言标记字符串的结束,占用一个单元,所以长度为50的数组只能存储49个字符。数组的容量至少要比待存储的字符数多 1 位。

​ scanf在读取字符串时,遇到空白符(空格,制表符或换行符)就不再继续读取输入,例如输入Cris Paul, scanf("%s",name) 只会读取到Cris。C语言还有其他的输入函数可以读取字符串,后面会学习到。

​ 注意定义字符和字符串的区别,字符是基本类型(char),字符串是派生类型(char 数组),区别如图。

​ sizeof() 函数返回的是该数组有多少个存储单元,strlen() 返回的是字符串的长度(不包含结束符 \0)。strlen() 知道在何处停止。

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

  1. const 限定符

    const限定符用于限定一个变量为只读(是只读变量,不是常量),const 用起来比 #define更加灵活。

const int MONTHS = 12; // MONTHS在程序中不可更改,值为12
  1. 明示常量

引入头文件<limits .h> ,输出INT_MAX和INT_MIN,可以查看当前系统下int 的最大值和最小值。

#include <stdio.h>
#include <limits.h>

int main() {
    printf("int最大值是:%d",INT_MAX);
    printf("int最小值是:%d",INT_MIN);
}

下面是在64位系统下的输出

int最大值是:2147483647
int最小值是:-2147483648

​ 类似地,float.h头文件中也定义一些明示常量,如FLT_DIG和DBL_DIG,分别表示float类型和double类型的有效数字位数。表中所列都与float类型相关。把明示常量名中的FLT分别替换成DBL和LDBL,即可分别表示double和long double类型对应的明示常量(表中假设系统使用2的幂来表示浮点数)

  1. printf() 函数

printf的占位符如下:

注意:printf()函数使用%符号来标识转换说明,因此打印%符号就成了个问题。如果单独使用一个%符号,编译器会认为漏掉了一个转换字符。解决方法很简单,使用两个%符号就行了:

pc = 2*6;
printf(" %d%% \n", pc);

输出结果为 : 12% 。

下面是占位符的修饰符及含义:

下表为 printf() 中的标记

  1. scanf() 函数
  • 如果使用scanf() 读取基本变量类型的值,在变量名前加上一个 & ;
  • 如果使用scanf() 读取字符串,不使用 & 。
  • scanf() 使用空白(换行符、制表符、空格)把输入分为多个字段(唯一例外的是 %c 会读取包含空白在内的每个字符)。
#include <stdio.h>
// 示例程序
int main() {
    char name[100];
    int age;
    float weight;

    printf("请输入你的姓名,年龄,体重\n");
    scanf("%s  %d   %f", name,&age,&weight);
    
    printf("所以,你的姓名是%s,年龄是%d,体重是%f\n",name,age,weight);
    return 0;
}
//运行结果
请输入你的姓名,年龄,体重
sunjian    23   75.0
所以,你的姓名是sunjian,年龄是23,体重是75.000000

​ 下表是scanf() 的转换说明




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容