1、字符
①字符的输入:scanf( ),getchar( )
其中比较常用的是getchar( ),函数原型是getchar(void),从键盘获取一个字符,进行输入时,遇到回车符时结束输入,将存储的第一个字符存在缓冲区中。
1 #include<stdio.h>
2 //#include<string.h>
3 int main(void)
4 {
5 char ch;
6 ch=getchar();
7 putchar(ch);
8 return 0;
9 }
输入:qwe
输出:q
②字符的输出:printf( ),putchar( )
putchar( )与getchar( )相对应,将通过getchar()保存在缓冲区的字符输出到屏幕上
--------------------------------------------------分割线-----------------------------------------------------------
2、字符串
字符串 以‘\0’结尾 ‘\0’占用内存空间,但不计入字符串长度,另外,没有字符串变量类型。
存储的形式主要有以下几种:
①字符数组保存字符串
char ch[20]=“hello”;
char ch[20]={‘h’,‘e’,‘l’,‘l’,‘o’,’\0’};
char ch[5]=“hello”; //错误
char ch[5]={‘h’,‘e’,‘l’,‘l’,‘o’}; //字符数组,不能叫字符串
② 字符指针保存字符串
char *p=“hello”; // "hello"字符串常量就表示这个字符串的首地址
#include <stdio.h>
int main(void)
{
char *p="hello";
*p='r'; //段错误,字符指针保存的只是字符串的首地址,字符串位于常量区域,常量区域的数据只读,不能被修改
printf("%s\n",p);
return 0;
}
保存多个字符串的方法:
char ch[5][20]={“hello”,“ok”};
char *p[5]={“hello”,ok};
3、字符串的输入输出
①gets( )+puts( )
#include <stdio.h>
int main(void)
{
char ch[20];
gets(ch); //这个函数比较危险,如果输入的字符个数大于缓冲区大小,会出错
puts(ch);
return 0;
}
②scanf( )+printf( )
#include <stdio.h>
int main(void)
{
char p[20]; //不能使用char *
scanf("%s",p); //p是数组名字,是数组首地址
printf("%s\n",p); //从首地址p开始一个字符一个字符的打印,直到遇到\0结束.
return 0;
}
4、字符串的相关函数
①strlen( )
用于计算字符串长度,即字符个数,不包括结束字符‘\0’
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[20]="hello";
printf("%d\n",strlen(ch)); //strlen用于求字符串长度,操作对象只能是字符类型的数组或指针
printf("%d\n",sizeof(ch)); //sizeof用于求类型大小, 操作对象可以是任意类型
char *p="ok jack!";
printf("%d\n",strlen(p));
printf("%d\n",sizeof(p));
return 0;
}
②strcpy( )
函数原型char *strcpy(char *dest, const char *src); 拷贝src字符串到dest中
③strncpy( )
函数原型char *strncpy(char *dest, const char *src, size_t n);拷贝src前n字节大小的字符个数到dest中
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[20]="hello";
char sh[20];
//strcpy(sh,ch); //不能把一个数组整体赋值给另一个数组。只能一个成员一个成员的赋值。对于字符数组来说有专门的函数。
bzero(sh,20);
strncpy(sh,ch,3);
printf("%s\n",sh);
return 0;
}
④ strcmp( )
函数原型int strcmp(const char *s1, const char *s2);
⑤ strncmp( )
函数原型int strncmp(const char *s1, const char *s2, size_t n);
s1 > s2 返回值 >0 1
s1== s2 =0
s1 < s2 <0 -1
比较依据:先比较两个字符串的第一个字符的ascii码。如果s1的比s2的大,就结束比较认为s1>s2
如果s1的比s2的小,就结束比较认为s1<s2
如果s1的与s2的相等,比较第二个字符,以此类推.
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[20]="hello";
char sh[20]="hdllz";
//int ret=strcmp(ch,sh);
int ret=strncmp(ch,sh,4);
printf("%d\n",ret);
return 0;
}
⑥ strstr( )
char *strstr(const char *haystack, const char *needle); 查找在字符串haystack中有无子串needle,如果有返回子串地址,否则返回NULL “hello” “llo”
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[20]="hello";
//char sh[20]="llo";
char sh[20]="hel";
char *p=strstr(ch,sh);
printf("%s\n",p);
return 0;
}
⑦strcat( )
函数原型char *str(char * s1,const char * s2);
s2指向的字符串复制到s1指向字符串的结尾,返回值是s1,一个地址。
⑧strncat( )
函数原型char *str(char * s1,const char * s2,size_t n);
s2字符串中只有前n个字符被复制到s1字符串,s2字符串中空字符及其后的任何字符都不会被复制,并在s1后面追加一个空字符,返回值是s1
注意:与strcpy( )还有strncpy( )区分,strcat( )和strncat( )所复制的字符中,第一个字符会覆盖掉s1结尾的空字符,而前者会将空字符保留
⑨strchr( )
函数原型char *strchr(const char * s,int c);
函数返回一个指向字符串s中存放字符c的第一个位置的指针,如果没有字符c,函数返回空指针。
⑩strrch( )
函数原型char *strchr(const char * s,int c);
函数返回一个指向字符串s中字符c最后一次出现的位置的指针,如果没有字符c,函数返回空指针。
⑾strpbrk( )
函数原型char *strchr(const char * s1,const char * s2);
函数返回一个指针,执行字符串s1中存放s2字符串中的任何字符的第一个位置。如果没找到任何一个字符,返回空指针。