标准C语言(9)
C语言里所有文字信息必须记录在一组连续的字符类型存储区里
所有文字信息必须以字符'\0'做结尾,这个字符的ASCII码就是0
符合以上两个特征的内容叫字符串,它们可以用来在程序里记录文字信息.字符串里'\0'字符前面的部分是有效文字信息,所有字符串都可以用字符类型指针表示
字符串字面值是一种字符串,用一对双引号中间的一组字符表示(例如"abc","#@%#@%"等).编译器在编译的时候自动在字符串字面值的末尾加上'\0'字符.编译器会把字符串字面值替换成第一个字符所在存储区的地址.字符串字面值的内容在程序执行过程中不可以修改,内容一样的字符串字面值其实是同一个,多个并列的字符串字面值会被合并成一个
字符数组也可以用来存放字符串,只有包含'\0'字符的字符数组里才能记录字符串,可以用字符串字面值对字符数组进行初始化,这个时候计算机会把字符串字面值里的所有字符(包括'\0'字符)都复制到字符数组里,字符数组里的字符串内容可以修改
printf函数可以把一个字符串里所有有效字符显示在屏幕上,这个时候要使用%s作为占位符
/*
* 字符串演示
* */
#include <stdio.h>
int main() {
char str[] = "abcdef";
printf("%p\n", "abc");
printf("%p\n", "abc");
printf("%p\n", "ab""c");
printf("%c\n", *"abc");
printf("%d\n", *("abc" + 3));
//*"abc" = 'x'; 错误
printf("sizeof(str)是%d\n", sizeof(str));
printf("%s\n", "abcdef");
return 0;
}
不可以在程序里用操作符对字符串进行操作,C语言里提供一组标准函数用来操作字符串,为了使用这些标准函数需要包含string.h头文件
strlen 统计字符串里有效字符个数
strcat 把两个字符串合并成一个,第一个参数必须是放在字符数组里的字符串,这个函数有可能修改不属于数组的存储区,这可能造成严重错误
strncat 这个函数功能和strcat类似,但是可以避免strcat的问题
strcmp 用来比较两个字符串的大小,根据ASCII码比较大小,如果返回值是1表示前一个字符串大,如果返回值是-1表示后一个字符串大,如果返回值是0表示一样大
strncmp 比较两个字符串的前n个字符
strcpy 把一个字符串复制到字符数组里,这个函数有可能修改不属于数组的存储区,这可能造成严重错误
strncpy 功能和strcpy类似,但是可以只拷贝,字符串里前n个字符,有可能不复制'\0'字符
memset 用来把一个字符数组里前n个存储区的内容设置成某一个字符
strstr 用来在一个大字符串里查找某个小字符串所在的位置,如果找不到则返回值NULL
/*
* 字符串演示
* */
#include <stdio.h>
#include <string.h>
int main() {
char str[10] = "abc";
printf("有效字符个数是%d\n", strlen(str));
printf("sizeof(str)是%d\n", sizeof(str));
printf("%s\n", strcat(str, "xyz"));
printf("%s\n", str);
printf("比较结果是%d\n", strcmp("abc", "abd"));
printf("%s\n", strcpy(str, "xyz"));
printf("%s\n", str);
memset(str, 'h', 9);
printf("%s\n", str);
printf("%s\n", strstr("abcdefghijklmn", "def"));
return 0;
}
以下两个字符串相关的函数不需要包含string.h头文件
sprintf 按照格式把多个数字合并成一个字符串并记录到字符数组里
sscanf 按照格式从字符串里获得多个数字并记录到存储区里
/*
* 字符串函数演示
* */
#include <stdio.h>
int main() {
char str[20] = {0};
char ch = 0;
int num = 0;
float fnum = 0.0f;
//printf("%d %g %c\n", 45, 6.5f, 't');
sprintf(str, "%d %g %c\n", 45, 6.5f, 't');
printf("%s", str);
//scanf("%c%d%g", &ch, &num, &fnum);
sscanf("p 34 6.5", "%c%d%g", &ch, &num, &fnum);
printf("%d %g %c\n", num, fnum, ch);
return 0;
}
以下两个函数可以把字符串里的数字转换成数字类型,为了使用这两个函数需要包含stdlib.h头文件
atoi 用来把字符串开头部分的整数转换成整数类型
atof 用来把字符串开头部分的浮点数转换成双精度浮点类型
在scanf标准函数里使用%s做占位符可以把用户在键盘上输入的字符串记录到字符数组里,这种方法可能造成严重错误
fgets函数也可以从键盘得到一个字符串并记录到字符数组里,这个函数可以避免scanf函数的问题,这个函数需要三个参数
1.数组名称
2.数组里存储区个数
3.用stdin表示键盘
/*
* 字符串演示
* */
#include <stdio.h>
#include <string.h>
int main() {
char str[10] = {0};
printf("请输入一个字符串:");
//scanf("%s", str);
fgets(str, 10, stdin);
if (strlen(str) == 9 && str[8] != '\n') {
scanf("%*[^\n]");
scanf("%*c");
}
printf("%s\n", str);
printf("请输入一个字符串:");
//scanf("%s", str);
fgets(str, 10, stdin);
printf("%s\n", str);
return 0;
}
如果输入内容不能充满数组就把用户最后输入的回车当作'\n'字符也放到数组里.如果输入的内容超过数组里存储区的数量就只会把,输入内容的前面部分放到数组里,后面的部分当作下一个字符串等以后读取.应该在每次使用fgets函数获得字符串以后清理掉输入缓冲区里可能存在的多余数据.应该把清理语句放在一个分支里,分支要保证输入缓冲区里有多余的数据
标准C语言(9)的更多相关文章
- 关于标准C语言的预定义宏【转】
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__ 当 ...
- 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
零. 优先级 在C++ Primer一书中,对于运算符的优先级是这样描述的: Precedence specifies how the operands are grouped. It ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__ 当前 ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。
UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- 标准C语言(1)
C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...
- 【M35】让自己习惯于标准C++语言
1.最近一些年C++语言增加的特性有: a.RTTI,namespace,bool,关键字mutable和explicit,enums,以及const static int可以直接初始化. b.扩充了 ...
- 标准C语言的输入输出流(i/o)方法详解
cppreference.com -> 标准 C I/O ->详细说明 标准 C I/O clearerr 语法: #include <stdio.h> void cleare ...
随机推荐
- C语言基础:递归函数,全局(局)变量
#include <stdio.h>int factorial(int a); int Fibonacci(a);long Hanoi(a); void main(){ } 函数递归调用: ...
- mybatis-generator自动生成代码时,只生成insert方法
今天使用mybatis-generator自动生成代码时,发现只能生成insert方法, 以前所有的方法都是可以生成的,查看网上解决办法和检查数据库表结构后, 发现2种可以解决的办法: 1.修改myb ...
- mariadb(第二章)增删改 MariaDB 数据类型
MariaDB 数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的 常用的数据类型 整数:int, bit 小数:de ...
- Cisco路由器的dhcp服务的配置的命令
Router(config)#IP DHCP POOL Jason Router(dhcp-config)#net 172.16.10.0 255.255.255.0 Router(dhcp-conf ...
- 蒲公英v5p%n搭建局域网后用nginx做代理的配置
1.nginx.conf worker_processes auto; error_log /usr/local/var/log/nginx/error.log; events { worker_co ...
- stm32 F40x CCM数据区的使用
1. CCM需要打开总线时钟 2. CCM可以作为堆和栈使用 使用分散加载文件直接操作即可 RW_CCMRAM1 0x10000000 { .ANY (HEAP) .ANY (STACK) } 3. ...
- aws技术链接
S3: https://docs.aws.amazon.com/s3/?id=docs_gateway emrfs: https://docs.aws.amazon.com/emr/latest/Ma ...
- Oracle密码过期(the password has expired)
1.进入sqlplus模式--sqlplus / as sysdba; 2.查看用户密码的有效期设置(一般默认的配置文件是DEFAULT) SELECT * FROM dba_profiles WHE ...
- PTA(Basic Level)1021.个位数统计
给定一个 k 位整数 \(N=d_{k−1}10^{k−1}+⋯+d_110^1+d_0 (0≤d_i≤9, i=0,⋯,k−1, d_{k−1}>0)\),请编写程序统计每种不同的个位数字出现 ...
- Shell初学(五)bash shell的基本功能
记住,所谓的bash shell 并不单纯指的是shell脚本,其实是Linux系统的所有指令集. shell脚本 只是汇总了指令集到文件,然后按流程和顺序执行. [1]如何查看我们的预设shell ...