内容简介
是我个人对C/C++的基础知识的再复习笔记
(使用的教材为:晴神宝典(算法笔记)+刘大有版数据结构+谭浩强C++)
内容主要分为以下几大块,需要的朋友们请自提:
①字符串存储构成及读写;
②string.h头文件;(本科期间的朋友们可以忽略它了,考试一般不让用)
③KMP模式匹配算法。
字符串存储构成及读写
1.构成
字符串从本质上说就是一个数组,只不过里面的元素都是字符型而已(char),它的特异之处在于,最后一位是’\0’,是默认存储形式,就像链表的最后一个链接处一定是NULL 一样,’\0’用于判断数组的结尾。
同样也是因为’\0’,所以在设定字符串长度的时候一定要比实际内容再多出一个(不是特别占空间的话不如多申请一些)
2.读写
读字符串有以下几种方式:
int a[N];
scanf("%s",a); //不要在数组名字前面加&
gets(a);
写字符串
printf("%s",a);
puts(a);
如果使用getchar(),就要单独添加’\0’
string.h头文件
1.头文件书写形式
#include <string.h>
2.主要函数
1)int a[N];
int len=strlen(a);//用于统计字符串长度,并返回长度的整数值
2)int a[N];
int b[N];
int res=strcmp(a,b); //用于比较两个函数的字典序,返回负数则前面的小,相等返0
3)int a[N];
int b[N];
strcpy(a,b); //把b数组的值复制给a数组,自带’\0’,完全覆盖
4)int a[N];
int b[N];
strcat(a,b); //把B数组接到A数组后面
5)爆炸实用的字符串转数字来惹!
//下面两个函数都在stdio.h头文件下
sscanf(str,"%d",&n); //str字符串中的内容以整数形式保存到n中字符串转数字
sprintf (str,"%d",n) ; //把n这个整数保存到字符串中,变成一个字符串数字转字符串
用法类似于fscanf,fprintf
KMP模式匹配算法
给定两个字符串变量S和P,其中目标串S有n个字符,模式串P有m个字符,m<=n,从S的指定位置开始,搜索模式串P,如果找到,返回P在S中成功匹配的位置,如果没找到,返回-1;
在这里送上KMP傻瓜算法——
#include <stdio.h>
#include <string.h>
#define N 20
#define N 20
int kmp(char *a,char *b,int m,int n);//模式匹配算法
int main()
{
printf("\n\n\t——本函数用于模式匹配算法——");
char a[N];
char b[N];
printf("\n\n\t请输入字符串A :"); //用户输入数据
scanf("%s",a);
printf("\n\n\t请输入字符串B:");
scanf("%s",b);
int m=strlen(a);//统计字符串长度
int n=strlen(b);
//printf("%d %d",m,n);
int res=kmp(a,b,m,n);//调用匹配函数
if(res==-1)//输出结果
{
printf("\n\n\t无法匹配。");
}
else if(res>=0)
{
printf("\n\n\t第一次出现位置为第%d位。",res);
}
printf("\n\n\t——算法结束——");
return 0;
}
int kmp(char *a,char *b,int m,int n)//模式匹配算法
{
int i,j;
bool match=false;
for(i=0;i<m;i++)
{
j=0;
if(a[i] == b[j])
{
match=true;
int k=i+1;
for(j=1;j<n;j++)
{
if(a[k]!=b[j])
{
match=false;
break;
}
else{
k++;
}
}
}
if (match == true)
{
return i+1;
}
}
if(match==false)
return -1;
}