文章目录

  • 1. 字符串的输出遍历
  • 2. 字符串与函数
  • 3. 字符串指针的初始化
  • 4. 字符数组
  • 5. 字符串函数
  • 6. 练习:天干地支

1. 字符串的输出遍历

字符串遍历打印:

#include <stdio.h>int main(){char s[] = "Hello World";char* p = s;for(int i=0;'\0'!=s[i];++i){printf("1:%c\n",s[i]);}for(int i=0;'\0'!=*(s+i);++i){printf("2:%c\n",*(s+i));}for(;'\0'!=*p;p++){printf("3:%c\n",*p);}p=s;while('\0'!=*p){printf("4:%c\n",*p);++p;}p=s;while('\0'!=*p){printf("5:%c\n",*(p++));}p=s;while('\0'!=*p){printf("6:%c\n",*p++);}
}

结果为:

1:H
1:e
1:l
1:l
1:o
1:
1:W
1:o
1:r
1:l
1:d
2:H
2:e
2:l
2:l
2:o
2:
2:W
2:o
2:r
2:l
2:d
3:H
3:e
3:l
3:l
3:o
3:
3:W
3:o
3:r
3:l
3:d
4:H
4:e
4:l
4:l
4:o
4:
4:W
4:o
4:r
4:l
4:d
5:H
5:e
5:l
5:l
5:o
5:
5:W
5:o
5:r
5:l
5:d
6:H
6:e
6:l
6:l
6:o
6:
6:W
6:o
6:r
6:l
6:d

s=p;是不允许的,因为s不是变量

打印字符,指针向后打印循环:

#include <stdio.h>int main(){char s[]="Hello World";char* p=s;printf("%s\n",s);while('\0'!=*p){printf("%s\n",p++);}
}

结果为:

Hello World
Hello World
ello World
llo World
lo World
o WorldWorld
World
orld
rld
ld
d

更改字符串中的字符:

#include <stdio.h>int main(){char s[]="Hello World";char* p=s;s[1] = 'p';    //*(s+1)printf("s:%s\n",s);printf("p:%s\n",p);s[4] = 'y';    //*(p+4)printf("s:%s\n",s);printf("p:%s\n",p);
}

结果为:

s:Hpllo World
p:Hpllo World
s:Hplly World
p:Hplly World

2. 字符串与函数

使两个字符串交换内容,在一个字符串后加另一个字符串:

#include <stdio.h>//a字符串和b字符串交换内容
void Swap(char* a,char* b){/*      printf("%s %s\n",a,b);char* t=a;a=b;b=t;printf("%s %s\n",a,b);
*/for(int i=0;'\0'!=a[i];++i){char t = a[i];a[i] = b[i];b[i] = t;}
/*while('\0'!=*a){char t = *a;*a = *b;*b = t;++a;++b;}
*/
}//把b的字符串加在a字符串的后面,并返回a的地址
char* Strcat(char* a,char* b){/*      while('\0'!=*a){++a;}for(int i=0;'\0'!=b[i];++i){*a=b[i];++a;}*a = '\0'
*/char* res = a;while('\0'!=*a)++a;while('\0'!=*b){//*a=*b;//++a;//++b;*a++ = *b++;}*a = '\0';return res;
}int main(){char a[]="Hello";char b[]="World";printf("%s %s\n",a,b);Swap(a,b);printf("%s %s\n",a,b);char c[11]="happy";//Strcat(c,a);//printf("%s\n",c);//printf("%s\n",Strcat(c,a));char d[15]="Say:";printf("%s\n",Strcat(d,Strcat(c,a)));
}

结果为:

Hello World
World Hello
Say:happyWorld

字符串返回只能使用指针 char*

3. 字符串指针的初始化

字符串可以对指针这样初始化
char* ps3 = “Hello”;
不能这样初始化
char* ps4 = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’};

指针只能存地址
char s2[] = “Hello”;      代表Hello字符进入s2
char* ps3 = “Hello”;      代表Hello的首地址进入ps3
指针初始化指向一个字符串常量,该字符串常量将不能更改

虽然ps3是指针,但当
printf("%s\n",ps3);      printf会因为看到%s把ps3地址中的字符打印出来

字符串指针初始化的方法体现在程序中就是:

#include <stdio.h>int main(){int arr[] = {1,2,3,4,5,6};int* pa = arr;char s[] = {'H','e','l','l','o','\0'};char* ps = s;char s2[] = "Hello";char* ps2 = s2;char* ps3 = "Hello";printf("%s\n",s);printf("%s\n",ps2);printf("%s\n",ps3);printf("Hello\n");printf(s);printf(ps);printf(ps2);printf(ps3);printf("%s\n","Hello");
}

结果为:

Hello
Hello
Hello
Hello
HelloHelloHelloHelloHello

注意: char* ps3 = “Hello”; 直接用来初始化的话,将不能更改里面的内容,如同 const char str[] = “Hello”;

4. 字符数组

更改字符数组:

#include <stdio.h>
#include <string.h>int main(){char str[] = "Hello";//str[1] = 'y';char* pstr = str;pstr[1] = 'y';printf("%s\n",pstr);
}

结果为:

Hyllo

sizeof() 和 strlen() 的使用:
都是放入的地址,计算字符个数

#include <stdio.h>
#include <string.h>int main(){char s2[] = "Hello";char* ps2 = s2;printf("%d\n",sizeof(s2));printf("%d\n",sizeof(ps2));printf("%d\n",strlen(s2));printf("%d\n",strlen(ps2));
}

结果为:

6
8
5
5

sizeof(字符数组);      6 ,表示共 6 个字符包括 \0
sizeof(指针);         8 ,表示地址是 8 位

strlen(字符数组);      5 ,表示 \0 前有 5 个字符
strlen(指针);          5 ,表示 \0 前有 5 个字符

5. 字符串函数

字符串的长度
size_t strlen(const char *s);
返回字符串长度不包含\0。

字符串的比较
int strcmp(const char* s1,const char* s2);
返回 0,表示 s1 == s2
返回 >0,表示 s1 > s2
返回 <0,表示 s1 < s2

字符串的复制
strcpy(dst,src);
把字符串src拷贝到dst

字符串的连接
strcat(t,s) 把s字符串连接到t上:

#include <stdio.h>
#include <string.h>void times(char* t,int n,char* s){for(int i=0;i<n;++i){strcat(t,s);}
}int main(){char s[20];scanf("%s",s);int n;scanf("%d",&n);char t[100]={0};times(t,n,s);printf("%s\n",t);
}

结果为:

abcd
3
abcdabcdabcd

小知识:
0 与 \0
\0 的 ascii 值是 0,所以对字符赋值 0 相当于加 \0,与 ‘0’ 不同

6. 练习:天干地支

已知十天干和十二地支
天干: 甲、乙、丙、丁、戊、己、庚、辛、壬、癸
地支: 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥
按顺序打印六十甲子
甲子、乙丑、丙寅、丁卯、戊辰、己巳、庚午、辛未、壬申、癸酉、
甲戌、乙亥、丙子、丁丑、戊寅、己卯、庚辰、辛巳、壬午、癸未、
甲申、乙酉、丙戌、丁亥、戊子、己丑、庚寅、辛卯、壬辰、癸巳、
甲午、乙未、丙申、丁酉、戊戌、己亥、庚子、辛丑、壬寅、癸卯、
甲辰、乙巳、丙午、丁未、戊申、己酉、庚戌、辛亥、壬子、癸丑、
甲寅、乙卯、丙辰、丁巳、戊午、己未、庚申、辛酉、壬戌、癸亥
六十年一个循环
已知今年的纪年,输入21世纪任意年份,打印出对应的甲子

#include <stdio.h>
#include <string.h>// 查找字符,返回第几个
int GetNumber(char* now){char* tianguan = "甲乙丙丁戊己庚辛壬癸";char* dizhi = "子丑寅卯辰巳午未申酉戌亥";char temp[7];for(int i=0;i<60;++i){// 数据按格式写入字符串sprintf(temp,"%.3s%.3s",tianguan+i%10*3,dizhi+i%12*3);if(strcmp(temp,now) == 0){return i;}}return -1;
}// 对应打印表格
void Print(int index){char* tianguan = "甲乙丙丁戊己庚辛壬癸";char* dizhi = "子丑寅卯辰巳午未申酉戌亥";for(int i=0;i<60;++i){if(index == i) printf("%.3s%.3s",tianguan+i%10*3,dizhi+i%12*3);}
}int main(){// 2021 "辛丑" 37// 2020 "庚子" 36// 2019 "己亥" 35// ···// 2000 "庚辰" 37-(2021-2000)=16for(int i=0;i<60;++i){Print(i);printf(" ");if(i%10 == 9) printf("\n");}// 查看2000是什么年int index = GetNumber("辛丑");Print(index-(2021-2000));printf("\n");
}

结果为:

甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
庚辰

还可以用创建表格的方式进行打印和查找
完成打印2000年后100年的天干地支:

#include <stdio.h>
#include <string.h>int main(){// 2021 "辛丑" 37// 2020 "庚子" 36// 2019 "己亥" 35// ···// 2000 "庚辰" 37-(2021-2000)=16char* tiangan = "甲乙丙丁戊己庚辛壬癸";char* dizhi = "子丑寅卯辰巳午未申酉戌亥";// 创建一个表格char table[60][7];// 先把文字写在60个空的表格中for(int i=0;i<60;++i){sprintf(table[i],"%.3s%.3s",tiangan+i%10*3,dizhi+i%12*3);}// 再打印排列表格for(int i=0;i<60;++i){printf("%s ",table[i]);if(i%10 == 9) printf("\n");}int year = 2021;char* now = "辛丑";int index = 0;for(int i=0;i<60;++i){// 找到后就把序号给indexif(strcmp(table[i],now) == 0){index = i;break;}}printf("2000 = %s\n",table[index-(2021-2000)]);int start = index-(2021-2000);// 打印出2000年后100年的天干地支for(int i=0;i<100;++i){printf("%s ",table[start]);++start;start = start%60;if(i%10 == 9) printf("\n");}
}

结果为:

甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
2000 = 庚辰
庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑
庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥
庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉
庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未
庚申 辛酉 壬戌 癸亥 甲子 乙丑 丙寅 丁卯 戊辰 己巳
庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯
庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑
庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥
庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉
庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未

C语言初阶:字符串,字符串搭配函数与指针的多重奥秘相关推荐

  1. C语言初阶——5.字符串

    C语言初阶--5.字符串 1. 字符串操作 1.1 字符串遍历 可以通过数组方式遍历字符串. char* str="Hello World"; for(int i = 0;'\0' ...

  2. C语言初阶(18) | 数组详解

    目录 1.数组的定义 2.一维数组 2.1一维数组的格式 2.2一维数组的初始化 2.3一维数组的使用 2.4一维数组再内存中的存储 3.二维数组 3.1二维数组的创建和初始化 3.2二维数组的使用 ...

  3. C语言初阶作业题-数组

    C语言初阶作业题-数组 一.选择题 1.关于一维数组初始化,下面哪个定义是错误的?( ) A.int arr[10] = {1,2,3,4,5,6}; B.int arr[] = {1,2,3,4,5 ...

  4. C语言初阶_初识C语言(1)

    凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...

  5. 五十分钟带你看遍C语言初阶语法(总纲)

    C语言初阶语法(总纲) 此篇博客包含了前面C语言所有的基础语法,写这一期的博客不仅是为了记录自己的学习成果也是为了让更多的朋友能学到对自己有用的知识,如果总有一个知识点帮助到了你,给卑微博主点点关注加 ...

  6. C语言初阶——6.进制

    C语言初阶--6.进制 1. 进制 百度百科: 进制也就是进位计数制,是人为定义的带进位的计数方法,对于任何一种进制-X进制,就表示每一位置上的数运算时都是逢X进一位. 十进制是逢十进一,十六进制是逢 ...

  7. C语言初阶第三篇:换我心,为你心,始知C语言 从C语言选择语句到循环语句保姆教学来喽

    换我心,为你心,始知C语言 老铁们,咱们上一篇文章把字符串的知识点给过了一遍,今天就要开始真正的程序语句的学习了,也就是选择语句和循环语句,今天的内容比较简单,所以写的也不多,废话不多说,咱们开始吧! ...

  8. C语言初阶总结 v1

    目录 C 基础1⭐ 数据类型 计算机中的单位 常量与变量 字符串/转意字符/ 注释 C 基础2⭐ 判断语句 函数与数组 C语言操作符 C语言关键字 C语言定义宏与关键字 初始指针 ⭐⭐ 指针基础 拓展 ...

  9. c语言初阶(2-函数-上篇)

    目录 1.函数是什么? 1.1库函数 cplusplus.com - The C++ Resources Network 1.2自定义函数 2.函数的参数 2.1实参: 2.2形参: 注意: 3.函数 ...

最新文章

  1. Android版本介绍
  2. 数据库设计中的14个技巧
  3. python霍夫变换检测直线_OpenCV-Python教程(9、使用霍夫变换检测直线)
  4. DSP与FPGA和嵌入式是什么关系?
  5. pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization)
  6. 正负样本不平衡处理方法总结
  7. SQL server中DateTime类型字段如何赋值零?
  8. easyUI 展开DataGrid里面的行显示详细信息
  9. 解决centos使用nc命令报错:Ncat: Connection refused.
  10. (转) RabbitMQ学习之spring整合发送同步消息(注解实现)
  11. 【kafka】生产者速度测试
  12. nodejs导出excel
  13. PHP_SELF,SCRIPT_NAME,SCRIPT_FILENAME,PATH_INFO,REQUEST_URI的区别
  14. MATLAB读取图片时报错:“错误使用 fopen 找不到文件,确保文件存在且路径” 的原因及解决方法
  15. 用matlab仿真自由落体,基于Matlab的小球自由落体仿真实现
  16. 一大波优秀3D作品来袭!看各国3D艺术家如何描绘2020!
  17. vue打包后在ie浏览器下访问报语法错误
  18. beamer笔记——幻灯片比例改为16:9
  19. 自定义控件从入门到轻生之---解锁新姿势
  20. 《隐私计算应用研究报告(2022年)》:规模将达到145.1亿元

热门文章

  1. google浏览器chrome无法导入IE收藏夹的问题
  2. 北大c语言百度云资源,北大C语言讲义.pdf
  3. HGAME 2023 Week1
  4. Selenium大家族介绍(selenium RC,selenium IDE, selenium Grid, selenium Webdriver)
  5. 数组<小罗爱c语言>
  6. JAVA进阶之路-CountDownLatch源码走读
  7. 高通平台Android源码bootloader分析之sbl1(一)
  8. ROS机器人驱动板(含原理图以及PCB)已经打板测试且正在使用
  9. 最近一口气发布了6款iOS app
  10. Visual Studio Ultimate 2013