函数
一维数组作为形参时的写法如下:
- 类型名 数组名 []
数组作为函数参数时,是传引用的,即形参数组改变了,实参数组也会改变。
数组作为函数参数时,往往必须再用另一个参数来传入数组的大小。
二维数组作为函数形参时,必须写明函数有多少列
- 类型名 数组名 [][N] N为列数
字符串
基本概念
1 | char word[] = {'h','i'} //字符数组 |
0标志字符串的结束,是字符数组的一部分,但它不是字符串的⼀部分。
- 计算字符串⻓长度的时候不包含这个0
常见的字符串声明:
1 | • char *str = “Hello”; //字符串常量,不可修改 |
C语⾔言的字符串是以字符数组的形态存在的,″Hello″会被编译器变成⼀个字符数组放在某处,这个数组的长度是6,结尾还有表⽰示结束的0。
- 如果要构造⼀一个字符串—>数组
- 如果要处理⼀一个字符串—>指针
声明一个空字符串
1 | char* str; //错误 |
str 是一个空字符串,str[0] == ‘\0’.
数组 str 的长度为 1。
1 | scanf(“%7s”, str); |
- 在%和s之间的数字表⽰示最多允许读⼊入的字符的数量,这个数字应该⽐比数组的大小⼀
- scanf 会自动添加结尾的’\0’
- scanf 和 cin 读入到空格为止
1
2
3// 原型 :gets(char buf[] )
while( gets(str) )
printf("%s",str); - 读入一行,自动添加 ‘\0’.
- 回车换行符不会写入 buf,但是会从输入流中去掉。
字符串数组
- char **a
a是⼀一个指针,指向另⼀一个指针,那个指针指向⼀一个字符(串)
- char a[][]
a是⼀一个⼆二维数组,第⼆二个维度的⼤大⼩小不知道,不能编译
- char a[][10]
a是⼀一个⼆二维数组,a[x]是⼀一个char[10]
- char *a[]
a是⼀一个⼀一维数组,a[x]是⼀一个char*
字符串函数
getchar()
1 | int getchar(void); |
- 从标准输⼊入读⼊一个字符
- 返回类型是int是为了返回EOF(-1)
1
2
3
4int c;
while((c=getchar())!=EOF){
printf ("%c", c);
}
库函数 string.h
strcmp
1 | int strcmp(const char *s1, const char *s2); |
比较两个字符串,返回:
- 0 : s1==s2
- >0 : s1>s2
- <0 : s1<s2
strcnmp
1 | int strncmp(const char *s1, const char *s2, int n); |
比较 s1 前 n 个字符组成的子串和 s2 前 n 个字符组成的子串的大小。
- 若长度不足 n,则取整个串作为子串。返回值和 strcmp 类似。
strcpy
1 | char * strcpy(char *restrict dst, const char *restrict src); |
- 把 src 的字符串拷⻉贝到 dst
- restrict 表明 src 和 dst 不重叠(C99)
strncpy
1 | char * strncpy(char *restrict dst, const char *restrict src, int n); |
拷贝 src 的前 n 个字符到 dest。
- 如果 src 长度大于或等于 n,该函数不会自动往 dest 中写入’\0’;若
- 若 src 长度不足 n,则拷贝 src 的全部内容以及结尾的’\0’到 dest。
strcat
1 | char * strcat(char *restrict s1, const char *restrict s2); |
- 把s2拷⻉贝到s1的后⾯面,接成⼀一个⻓长的字符串
- 返回s1
- s1必须具有⾜足够的空间
字符串中找字符:
strchr
1 | char * strchr(const char *str, int c); |
寻找字符 c 在字符串 str 中第一次出现的位置。
- 如果找到,就返回指向该位置的 char* 指针
- 若没找到,返回 NULL
strrchr
1 | char * strrchr(const char *s, int c); |
寻找字符 c 在字符串 str 中最后一次出现的位置。
字符串中找字符串:
strstr
1 | char * strstr(const char *s1, const char *s2); |
寻找子串 s2 在 s1 中第一次出现的位置。
- 如果找到,就返回指向该位置的指针。
- 若没找到,返回 NULL
源码1
2
3
4
5
6
7
8
9
10
11
12
13char *strstr( const char *s1, const char *s2 )
{
int len2;
if ( !(len2 = strlen(s2)) )
return (char *)s1; //字符串为空
for ( ; *s1; ++s1 )
{
if ( *s1 == *s2 && strncmp( s1, s2, len2 )==0 )
return (char *)s1;
}
return NULL;
}
其它:
strtok
1 | char * strtok( char *str, const char *delim); |
连续调用该函数若干次,可以做到:从 str 中逐个抽取被字符串 delim 中的字符分隔开的若干字符串。
判断子串的函数
描述:
编写一个函数:
int Strstr( char s1[], char s2[]);
如果 s2 不是 s1 的子串,返回 -1,如果 s2 是 s1 的子串,返回在 s1 中第一次出现的位置。空串是任何串的子串,且出现位置为 0.
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int Strstr(const char* s1, const char* s2)
{
if(s2[0]==0)
return 0;
for(int i=0;s1[i];i++){
int k=i;
int j=0;
for(;s2[j];j++,k++){
if(s1[k]!=s2[j])
break;
}
if(s2[j]==0)
return i;
}
return -1;
}
int main(int argc, char** argv) {
char s1[50];
gets(s1);
char s2[20];
gets(s2);
int f;
f = Strstr(s1,s2);
cout<<f;
return 0;
}