1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言初阶:字符串 字符串搭配函数与指针的多重奥秘

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

时间:2021-05-08 20:27:06

相关推荐

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

文章目录

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:H1:e1:l1:l1:o1: 1:W1:o1:r1:l1:d2:H2:e2:l2:l2:o2: 2:W2:o2:r2:l2:d3:H3:e3:l3:l3:o3: 3:W3:o3:r3:l3:d4:H4:e4:l4:l4:o4: 4:W4:o4:r4:l4:d5:H5:e5:l5:l5:o5: 5:W5:o5:r5:l5:d6:H6:e6:l6:l6:o6: 6:W6:o6:r6:l6: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 WorldHello Worldello Worldllo Worldlo Worldo WorldWorldWorldorldrldldd

更改字符串中的字符:

#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 Worldp:Hpllo Worlds:Hplly Worldp: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 WorldWorld HelloSay: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");}

结果为:

HelloHelloHelloHelloHelloHelloHelloHelloHello

注意: 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));}

结果为:

6855

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);}

结果为:

abcd3abcdabcdabcd

小知识:

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(){// "辛丑" 37// "庚子" 36// "己亥" 35// ···// 2000 "庚辰" 37-(-2000)=16for(int i=0;i<60;++i){Print(i);printf(" ");if(i%10 == 9) printf("\n");}// 查看2000是什么年int index = GetNumber("辛丑");Print(index-(-2000));printf("\n");}

结果为:

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

还可以用创建表格的方式进行打印和查找

完成打印2000年后100年的天干地支:

#include <stdio.h>#include <string.h>int main(){// "辛丑" 37// "庚子" 36// "己亥" 35// ···// 2000 "庚辰" 37-(-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 = ;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-(-2000)]);int start = index-(-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 = 庚辰庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥 甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。