c16---字符串
//
// main.c
// 字符串的基本概念,字符串和字符数组的共用的char[], #include <stdio.h> int main(int argc, const char * argv[]) { // 用双引号引起来的就是字符串
printf("Hello, World!\n"); // 如何定义字符串变量, 由于字符串是同一种类型的数据组成, 并且是有序的\
而数组就是用于存储很多同一种类型的有序数据, 所以可以使用数组来保存字符串 // 注意: 字符串变量和普通的字符数组有一定的区别
// C语言规定, 字符串必须以\0结尾(作为字符串的结束符号), 所以字符串变量的元素个数比字符数组的元素个数多一个 \0
char str[] = "lnj"; // 字符串变量 l n j \0
printf("str size = %lu\n", sizeof(str));// char charValues[] = {'l', 'n', 'j'}; // 字符数组 , 这个并不是字符串, 而是字符数组
printf("charValues size = %lu\n", sizeof(charValues));// int num = ;
float floatValue = 10.1f;
double doubleValue = 9.9;
char charValue = 'm';
printf("%i, %f, %lf, %c\n", num, floatValue, doubleValue, charValue);//10,10.100000,9.900000,m // 内存寻址从大到小
char str[] = "lnj"; // 字符串变量
char str2[] = {'x', '\0' ,'m', 'g'}; // 字符数组 // 如何输出字符串变量, %s
// str 数组的名称, 数组的名称就是数组的地址
// %s的原理, 从传入的"地址"开始逐个取出, 直到遇到"\0"位置
printf("str = %s\n", str2); // x, // 字符串注意点, 字符串的初始化
char str1[] = "lnj";
char str2[] = {'l', 'n', 'j', '\0'};
printf("str = %s\n", str2); // lnj
// 部分初始化, 部分初始化中, 没有被初始化的元素默认是0
// \0对应的ASCII 0
char str3[] = {'l', 'n', 'j'}; // l n j 0000000 char str4[] = {'l', 'n', 'j'}; // 该方式不是字符串, 而是字符数组, 因为没有\0,字符串和字符数组的共用的char[],
char str5[] = {'l', 'n', 'j'}; // 错误写法 // 需要明白的一点就是字符串以\0结尾, 没有\0就不是字符串
// 只要是用双引号括起来的都是字符串
// 字符串的本质就是数组
char str6[] = "lnj";
str6[] = 'y'; printf("%s", str6); return ;
}
//
// main.c
// 字符串常用方法1
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
#include <string.h>
int myStrlen(char str[]);
int myStrlen2(char str[], int length); int main(int argc, const char * argv[]) { // 1.如何输出字符串
// 1.1可以使用printf的%s占位符来输出
// 弊端 : 如果想要换行, 必须加上\n
// 优点 : 可以自定义格式化需要输出的字符串, 也就是可以按照我们需要的格式来输出
char str[] = "lnj";
printf("name = %s!!!!\n", str);
printf("-------\n"); // 1.2可以使用puts函数来输出
// 优点: 可以自动换行
// 缺点: 不可以自定义格式, 只能原样输出
puts(str);
printf("-------\n"); // 2.如何输入字符
// 2.1利用scanf接收字符串的注意点
// scanf接收字符串, 会以空格 , tab, 回车作为结束符号, 也就是说利用scanf接收字符串时, 字符串中不能出现空格, tab, 回车
printf("请输入一个字符串\n");
char buf[];
scanf("%s", buf);
printf("buf = %s\n", buf);
printf("-------\n"); // 2.2利用gets接收字符串
// warning: this program uses gets(), which is unsafe.
// 如果使用gets接收字符串, 系统会提示我们正在使用一个不安全的方法接收字符
// 优点: 如果利用gets接收字符串 , 可以在字符串中输入空格, tab
printf("请输入一个字符串\n");
char buf2[]; // lnj c
gets(buf2);
printf("buf = %s\n", buf2);
printf("-------\n"); // 3.如何计算字符串的长度
// 0123
char str[] = "lnj cool"; //
int length = sizeof(str) / sizeof(str[]) - ;
// strlen的原理: 从传入的地址开始逐个取出字符串, 每取出一个就让计数器+1. 直到遇到\0为止
size_t size = strlen(str); // 计算出来的结果不包括\0
int size = myStrlen(str);
int length = sizeof(str) / sizeof(str[]);
int size = myStrlen2(str, length); printf("length = %lu\n", size);
for (int i = ; i < size; i++) {
printf("str[%i] = %c\n", i , str[i]);
}
return ;
} int myStrlen2(char str[], int length)
{
// 1.定义变量记录取出了多少个字符
int count = ;
// 2.遍历字符数组
for (int i = ; i < length; i++) {
if (str[i] != '\0') {
count++;
}
}
return count;
} // 自定义一个strlen函数
int myStrlen(char str[])
{
// 1.定义变量记录取出了多少个字符
int count = ;
// 2.遍历字符数组
while (str[count] != '\0') {
count++; // 1 2 3
}
return count;
}
//
// main.m
// 字符串常用方法2
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
#include <string.h> int main(int argc, const char * argv[]) { // 1.字符串拼接
// 原理 : 首先遍历第一个字符串,直到遇到\0为止, 然后取出第二个字符串中的字符, 从\0的位置开始添加, 添加完毕之后再在最后添加一个\0 char str1[] = "lnj"; // l n j c o o l \0
char str2[] = " cool";
printf("拼接前: %s\n", str1);
// dest : 目标 src : 源
// 将src中的数据拼接到dest后面
// 注意: 要想使用字符串拼接函数, 那么dest必须是一个数组, 并且数组的长度必须大于拼接之后的长度 \
如果dest数组的长度, 不能完全存放dest+src+\, 那么就会报错
strcat(str1, str2); // char * 相当于dest const char * 相当于src size_t 需要拼接的个数
// 为了避免拼接之后超出str1的存储范围, 那么可以动态计算str2中需要拷贝几个到str1后面不会超出
// str1能够存放的元素个数 - str1已经存放的个数 - \0
size_t length = sizeof(str1) / sizeof(str1[]) - strlen(str1) - ;
printf("length = %lu\n", length);
strncat(str1, str2, length);
printf("拼接后: %s\n", str1); // 2.字符串拷贝
char str1[] = "lnj";
char str2[] = "cool";
printf("拷贝前 : str1 = %s\n", str1);
// char * 目标, const char * 源
// strcpy函数会将源的数据拷贝到目标中, 并且会覆盖掉目标中原有的数据
// 目标的容积必须能够存放拷贝的数据, 如果容积不够会报错
// strcpy(str1, str2); // char * 目标, const char * 源 size_t 需要拷贝几个
// 注意: 拷贝操作是逐个替换, 拷贝了几个就替换几个
// str1能够存放元素的个数 - 1是给\0留出位置
int length = sizeof(str1) / sizeof(str1[]) - ;
strncpy(str1, str2, length);
printf("拷贝后 : str1 = %s\n", str1); // 3.字符串比较
char str1[] = "aac"; // a a
char str2[] = "abc"; // a b // strcmp它会对传入的字符串进行比较, 比较完毕之后会返回一个整型的值给我们
// 如果该值等于0,那么证明两个字符串相等
// 如果该值小于0, 那么证明str1小于str2
// 如果该值大于0, 那么证明str1大于str2
// strcmp的原理: 取出字符串中的每一个字符进行逐个比较, 如果发现不相等就不会继续往下比较
int res = strcmp(str1, str2);
printf("res = %i\n", res); return ;
}
//
// main.m
// 字符串练习
// #include <stdio.h>
int char_contains(char str[], int length,char key);
int char_contains2(char str[],char key); int main(int argc, const char * argv[]) {
// 编写一个函数char_contains(char str[],char key), 如果字符串str中包含字符key则返回数值1,否则返回数值0
// 给你一个字符串和一个key, 要求从字符串中找出key, 如果找到就返回1没有找到就返回0
char str[] = "xiaomage";
char key = 'z';
int length = sizeof(str) / sizeof(str[]);
int res = char_contains(str, length, key);
int res = char_contains2(str, key);
printf("res = %i\n", res); return ;
} int char_contains2(char str[],char key)
{
/*
xiaomage a
x != a x != \0
i != a i != \0
a != a xia z
x != z x != \0
i != z i != \0
a != z a != \0
\0 != z \0!=\0
*/
/*
// 1.定义一个变量记录当前的索引
// int index = 0;
// 2.遍历数组, 取出当前的字符判断是否不等于key, 并且当前出去的字符不是\0 while (str[index] != key && str[index] != '\0') {
index++;
}
*/
int index = -;
while (str[++index] != key && str[index] != '\0'); // a != '\0'
// \0 != \0
// int res = str[index] != '\0' ? 1 : 0;
// return res;
return str[index] != '\0' ? : ;
} int char_contains(char str[], int length,char key)
{
for (int i = ; i < length; i++) {
if (str[i] == key) {
return ;
}
}
return ; }
//
// main.c
// 字符串数组
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) { char name1[] = "lnj";
char name2[] = "lmj";
char name3[] = "xb";
char name4[] = "lk"; // 如果想存储一堆字符串那么可以使用字符串数组
// 说白了字符串数组就是二维数组
char names[][] =
{
"lnj", //字符串
"lmj",
"xb",
"lk",
"xj"
} char names2[][] =
{
{'l', 'n', 'j', '\0'}, //有\0是字符串,不是字符数组,
{'l', 'm', 'j', '\0'} //有\0是字符串,不是字符数组,
} return ;
}
c16---字符串的更多相关文章
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- Javascript正则对象方法与字符串正则方法总结
正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
随机推荐
- 拖入浏览器读取文件demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 基于CXF搭建webService
1.导入相关jar包,具体哪些包我记不太清了 2.在applicationContext中加入相关配置信息,如下所示: <beans xmlns="http://www.springf ...
- CentOS 7 中配置通过 daemon 模式启动的 Tomcat 8 服务
距离上次折腾已经有很长一段时间了... 不说这个,刚好有空闲,把这两天折腾的 Tomcat 8 的服务配置整理出来收录一下. 1.JDK安装 1)检查服务器是否预装了 openJdk,如果有就删除,在 ...
- ORACLE锁表解锁
SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s W ...
- CNN结构:MXNet设计和实现简介
对原文有大量修改,如有疑惑,请移步原文. 参考链接:MXNet设计和实现简介 文章翻译于:https://mxnet.incubator.apache.org/architecture/index.h ...
- 阿里P7架构师详解微服务链路追踪原理
背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...
- esp32使iOS 获取蓝牙外设的Mac地址
最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32.这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙.二维码中包含了mac地址信息,在手机扫描周围设备的时候 ...
- 雪花算法生成全局唯一ID
系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...
- Hexo系列(四) NexT主题配置
Hexo 框架允许我们更换合适的主题,以便于构建不同风格的网站,这里介绍目前最常使用的一款主题之一 -- NexT 一.NexT 安装 在正式开始讲解 NexT 安装之前,我们必须明确以下几个概念: ...
- 63.es中的type数据类型
主要知识点 理解es中的type数据类型 一.type的理解 type是一个index中用来区分类似的数据的,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器.field的 ...