关于作者:
2019NOIP退役成员,学习c语言已有多年经验, 更懂得考试的题目,和初学者学习时所遇到的问题华为云享专家,以及CSDN的新星创作者,有写博客的一定能力
关于本栏目
本栏目的宗旨是带你入门c语言,作者打算用题海+c语言的概念来完成本栏目,
适用人群: 面向广大的编程爱好者和大学生来进行创作学完本栏后你能达到的水平:计算机二级水平左右,入门c语言学习
题目:主要来源于网络和c语言的入门算法题目
写在前面的话(第十四天)
记住我们的宗旨:努力去做,让一切交给时间来评判!
字符串
3种形式
1.字符数组
当以char型数组来存放字符串时,数组名市字符串的首地址
char name[] = "shuofeng";
则字符串name在内存中占有8个字节
- 动态字符串
可以动态的分配一块内存,然后在这块内存上存放一串字符,换句话说就是这个字符串对象在堆上存储
char str = (char )malloc(12);
str[0] = 's';
str[1] = 'h';
str[2] = 'u';
str[3] = 'o';
str[4] = 0; ,\0 是用于标记字符串的结束
- 常量字符串
在前面我们说过所有的字面常量都有它自己的数据类型,下面我们来说一种新的常量: 字符串字面常量
"hello world";
"shuofeng";
const char* a = "hello world";
都是字符串字面常量,其中const char*表示这个指针指向的内存是只读的,不能修改里面的内容。
字符串中常用的函数
字符串中有大量的函数,对于初学者来说我们掌握下面的即可
#include <stdio.h>
#include <string.h>
int main()
{
char str1[14] = "runoob";
char str2[14] = "google";
char str3[14];
int len;
/* 复制 str1 到 str3 */
strcpy_s(str3, str1);
printf("strcpy( str3, str1) : %s\n", str3);
/* 连接 str1 和 str2 */
strcat_s(str1, str2);
printf("strcat( str1, str2): %s\n", str1);
/* 连接后,str1 的总长度 */
len = strlen(str1);
printf("strlen(str1) : %d\n", len);
return 0;
}
字符串的遍历
遍历字符串指的是从前往后访问每一个字符
int show_string(const char* str)
{
for(int i = 0; str[i] ; i++)
{
printf("%c",str[i];
}
return 0;
}
结束‘\0'的作用就是标识字符串的结尾
字符串插入与删除的讨论
删除
假设给定字符串char [] = "hello"
删除e
相当于把s[2]-s[5]这几个内存中所含的各值向前移动一个字节
我们用代码来实现一下就是这样的:
void erase(char *src,int index)
{
for(int i = 0; ; i++)
{
src[i-1] = src[i];
if(src[i] == '\0')
break;
}
}
插入
插入一个字符串首先要保证原数组空间足够大,原因也和内存有关,在想指定位置插入字符串,后面的字符要依次向后移动
void Insert(char* src,int index,char ch)
{
int len = strlen(src);
for(int i = 0; i > index; i++)
src[i] = src[i-1];//逐个后移
src[index] = ch;//在这里插入
}
时间成本问题:
在字符串中的插入和删除操作都是一个高成本的操作,即使只增删一个字符也要把后面的字符都移动一遍