一、字符串的输入与输出
char word[8];
scanf("%s",word);
print("%s\n",word);
scanf读入一个连续的单词(到空格、回车或tab为止)
解析:如上程序1、输入少于8个连续字母,打印也是这少于8个连续字母
如上程序2、输入hello word这10个字母,打印的是hello这五5个字母,读到空格就结束
如上程序3、输入超过8个字母,并且连续的,即输入helloword,打印出错,因为word[8]只有7个位置可读入.第八个位置是\0.
二、字符串数组
2.1 char **a; 是什么
a是一个指针,指向另一个指针,那个指针指向一个字符(串)
2.2 char a[][5]; 第二个格子(列),必须有准确的数字
字符数组的引用 (注意事项)
用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志‘\0’;
2.3、数组的长度
一.计算一维数组长度对于 array[B] 形式的数组,可以通过计算 sizeof 获取数组长度,举个例子:
int len = sizeof(array)/sizeof(array[0]);
2.4.计算二维数组长度
对于 type array[A][B] 形式的二维数组,可以通过计算 sizeof 获取行列数
sizeof(array[0][0]) 是一个元素(格子)占用的空间;
sizeof(array[0]) 为一行元素(一行格子)占用的空间;
sizeof(array) 为整个数组占用的空间;
1).二维数组行数
二维数组行数 = sizeof(array)/sizeof(array[0]);
2).二维数组列数
二维数组列数 = sizeof(array[0])/sizeof(array[0][0]);
#include<stdio.h>
#include<string.h>
int main()
{
int i;
int h;
char word[][6]={"hello",
"word",
"huai"};
h= sizeof(word)/sizeof(word[0]); //求数组的行数
for(i=0;i<h;i++)
{
printf(" %s\n",word[i]);
}
return 0;
}
输出结果
hello
word
huai
三、strlen 和 sizeof区别
1)strlen函数获取字符串的长度,但不包括\0.
2)sizeof函数是获取空间的大小
#include<stdio.h>
#include<string.h>
int main()
{
char data[10]="hello";
printf("strlen=%d\n",strlen(data));
printf("sizeof=%d\n",sizeof(data));
char *a="hello"; //此串内容,包括了\0,即有6个字节
printf("strlen=%d\n",strlen(a));
return 0;
}
运行结果
strlen=5
sizeof=10strlen=5
四、字符串拷贝函数
4.1、函数的定义:
char *strcpy (char *dest, const char *src );
函数功能:
就是把src指向的字符串拷贝到dest指向的内存,并且也拷贝‘\0’
函数返回值:
dest 的内存的地址。
注意:
在使用此函数的时候,必须保证dest指向的内存空间足够大,否则会出现内存污染
#include<stdio.h>
#include<string.h>
int main()
{
char A[15]="hello word";
char B[8] ="WWO";
strcpy(A,B);
printf("A=%s\n",A);
for(int i=0; i<11;i++)
{
printf("A[%d] = %c \n",i,A[i]);
}
return 0;
}
运行结果
A=WWO
A[0] = W
A[1] = W
A[2] = O
A[3] =
A[4] = o
A[5] =
A[6] = w
A[7] = o
A[8] = r
A[9] = d
A[10] =
由上述代码可知,把B拷贝到A,输出A的结果是B,即WWO内容,但是,把A遍历之后发现,里面还是有原来没被覆盖的字符。为什么输出结果会这样??这是不管是printf 还是sacnf 只要遇到空格、换行符就打印结束。
4.2、函数的定义
char *strncpy(char * dest ,const char *src, size_t n);
函数功能
将src指向的字符串前n个字节,拷贝到dest指向的内存中
函数返回值:
dest 的内存的首地址。
注意:1)strncpy不拷贝'\0'
2)如果n大于src 指向的字符串中的字符个数则在dest后面填充n - strlen(src)个‘\0’。
#include<stdio.h>
#include<string.h>
int main()
{
char A[11]="hello word";
char B[8] ="WWO";
strncpy(A,B,strlen(B));
printf("A=%s\n",A);
for(int i=0; i<11;i++)
{
printf("A[%d] = %c \n",i,A[i]);
}
return 0;
}
运行结果
A=WWOlo word
A[0] = W
A[1] = W
A[2] = O
A[3] = l
A[4] = o
A[5] =
A[6] = w
A[7] = o
A[8] = r
A[9] = d
A[10] =
五、字符串追加函数
5.1、函数定义
char * strcat (char *dest ,const char *src);
功能:
strcat 函数追加 src 字符串到 dest 指向的字符串的后面,追加的时候会追加‘\o’
注意:
保证 dest 指向的内存空间足够大
#include<stdio.h>
#include<string.h>
int main()
{
char A[15]="hello word";
char B[8] ="aab";
//从A的\0的位置开始追加字符,并且也把B的\0加进去了
strcat(A,B);
printf("A=%s\n",A);
return 0;
}
运行结果
A=hello wordaab
5.2、函数定义
char * strncat (char *dest ,const char *src,size_t n);
功能:
追加src 指向的字符串的前n个字符,到dest 指向的字符串的后面。
注意:
如果n大于 src 的字符个数,则只将src字符串追加到dest 指向的字符串的后面追加的时候追加‘\0’.
#include<stdio.h>
#include<string.h>
int main()
{
char A[15]="hello word";
char B[8] ="aabhhj";
//从A的\0的位置开始追加字符,并且也把B的\0加进去了
strncat(A,B,3);
printf("A=%s\n",A);
return 0;
}
运行结果
A=hello wordaab
六、字符串比较函数
6.1 函数定义
int strcmp(const char *s1 ,const char *s2);
函数功能:
比较s1 和 s2 指向字符串的大小,
比较方法:逐个字符去比较ascII码,一旦比较大小返回。
返回值:
如果s1指向的字符串大于 s2 指向的字符串 返回>0
如果s1指向的字符串小于 s2 指向的字符串 返回<0
#include <stdio.h>
#include<string.h>
int main()
{
int ret1;
int ret2;
int ret3;
char s1[]="hello";
char s2[]="hella";
char s3[]="hell";
ret1 = strcmp(s1,s2);
ret2 = strcmp(s3,s2);
ret3 = strcmp(s3,s3);
printf("ret1=%d\n",ret1);
printf("s1跟s2比较,返回一个正数,即s1比s2大,且大了这个数\n");
printf("ret3=%d\n",ret3);
printf("s3跟s3比较,返回一个0,即 s3=s3\n");
printf("ret2=%d\n",ret2);
printf("s3跟s2比较,返回一个负数,即s1比s2小,且小了这个数的绝对值\n");
return 0;
}
运行结果
ret1=14
s1跟s2比较,返回一个正数,即s1比s2大,且大了这个数
ret3=0
s3跟s3比较,返回一个0,即 s3=s3
ret2=-97
s3跟s2比较,返回一个负数,即s1比s2小,且小了这个数的绝对值
6.2 函数定义
int strncmp(const char *s1 ,const char *s2,size_t n);
函数功能:
比较s1 和 s2指向的字符串中的前n个字符
七、字符串查找函数
7.1 函数定义
char *strchr(const char *s,int c);
函数功能:首次匹配
在字符指针s指向的字符串中,找第一次出现的ASCII为 c 的字符
注意:
是首次匹配,如果s指向的字符串中有多个ASCII为c的字符,则找的是第一个字符
返回值:
找到了返回找到的字符地址
找不到返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char s[]="hel6l0 worl6d";
char *ret = strchr( s ,'6');
if(ret==NULL)
{
printf("no find \n");;
}
else
{
printf("找到了,在数组的第%d位置 \n",ret-s);
}
return 0;
}
运行结果
找到了,在数组第3位置
7.1、函数定义
char *strrchr(const char *s,int c);
函数的功能:末次匹配
在s指向的字符串中,找最后一次出现的ASCII为 c 的字符
返回值:
找到了返回找到的字符地址
找不到返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char s[]="hel6l0 worl6d";
char *ret = strrchr( s ,'6');
if(ret==NULL)
{
printf("no find \n");;
}
else
{
printf("找到了,在数组第%d位置 \n",ret-s);
}
return 0;
}
运行结果
找到了,在数组第11位置
八、字符串匹配函数
8.1、函数定义
char * strstr(const char 8 haystack ,const char 8needle);
函数功能:首次匹配
在haystack 指向的字符串中查找 needle指向的字符串,也是首次匹配
返回值:
找到了返回找到的字符地址
没找到返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char s[]="1234:4567:666:789:7777";
char *ret = strstr( s ,"666"); //找的是,第一个\0之前的字符串,即 666
if(ret==NULL)
{
printf("no find \n");;
}
else
{
printf("找到了,在数组第%d位置 \n",ret-s);
}
return 0;
}
运行结果
找到了,在数组第10位置
九、字符串转换数值
函数定义:
int atio(const char *nptr); (字符串都是数字才行)
函数功能
将nptr指向的数字型字符串转换成整数,
#include<stdio.h>
#include<stdlib.h>
int main()
{
char s[]="7856";
char s1[]="3.155456";
int ret1 = atoi( s ); //atoi转int 型
double ret2 = atof( s1 ); //atof转double型
printf("ret1 = %d\n ",ret1);
printf("ret2 = %lf\n ",ret2);
return 0;
}
运行结果
ret1 = 7856
ret2 = 3.155456
十、字符串切割函数
函数定义:
char * strtok (char * str, const char *delim);
函数的功能;
字符串切割,按照delim 指向的字符串中的字符,切割str 指向的字符串。其实就是在str指向的字符串中发现了 delim 指向字符串中的字符,就将其变成‘\0’。调用一次 strtok 只切割一次,切割一次之后,再去切割的时候strtok 的第一参数传NULL,意思就是接着上次切割的位置继续切。
注意:
如果str 字符串中出现了连续的几个delim中的字符,则只将第一个字符变成‘\0’.
返回值:
返回切割下来的字符串的首地址,如果都切割完毕,则返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char s[]="1234:4567:666:789:7777";
char *ret = strtok(s,":");
printf("ret= %s\n",ret);
printf("接着切割,第一个参数填null\n");
while((ret=strtok(NULL,":")))
{
printf("ret= %s\n",ret);
}
return 0;
}
运行结果
ret= 1234
接着切割,第一个参数填null
ret= 4567
ret= 666
ret= 789
ret= 7777