1.输出字符串
(1)puts();(2)printf("%s",p)
2.获取字符串
(1)scanf("%s",p);(2)gets:char * gets ( char * str );因为本函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
#include <stdio.h>
int main()
{
char *p = "yingjie handsome";
char str[128] = {'\0'};
puts(p);
printf("%s\n",p);
printf("请输入字符串:\n");
//scanf("%s",str);
gets(str);
puts(str);
return 0;
}
3.计算长度:strlen
4.拷贝
(1)strcpy:char *strcpy(char* dest, const char *src);
#include <stdio.h>
#include <assert.h>
//3种方式实现拷贝函数strcpy
char *myStrcpy(char *des,char *src)
{
//assert作用是出现计算表达式expression,如果其值为假(即为0),
//那么它先向stderr打印一条出错信息,然后通过调用abort来终止程序运行
assert(des != NULL && src != NULL);//断言函数
char *back = des;
while(*src != '\0'){
*des = *src;
des++;
src++;
}
*des = '\0';
return back;
}
char *myStrcpy2(char *des,char *src)
{
char *back = des;
if(des == NULL || src == NULL){
return NULL;
}
while(*src != '\0'){
*des++ = *src++;
}
*des = '\0';
return back;
}
char *myStrcpy3(char *des,char *src)
{
char *back = des;
if(des == NULL || src == NULL){
return NULL;
}
while((*des++ = *src++) != '\0');
*des = '\0';
return back;
}
int main()
{
char str[128] = {'\0'};
char *pstr = NULL;
char *p = "yingjie handsome";
char a = 'm';
char b;
if((b=a) == 'm'){
printf("ok\n");
}
myStrcpy(str,p);
puts(str);
return 0;
}
(2)strncpy:char *strncpy(char *dest, const char *src, int n);
表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest 。
#include <stdio.h>
#include <assert.h>
char *myStrncpy(char *des,char *src,int count)
{
char *back = des;
if(des == NULL || src == NULL){
return NULL;
}
while(*src != '\0' && count > 0){
*des++ = *src++;
count--;
}
if(count > 0){
while(count > 0){
count--;
*des++ = '\0';
}
return des;
}
*des = '\0';
return back;
}
int main()
{
char str[128] = {'\0'};
char *pstr = NULL;
char *p = "yingjie handsome";
char a = 'm';
char b;
if((b=a) == 'm'){
printf("ok\n");
}
myStrncpy(str,p,7);
puts(str);
return 0;
}
5.断言:assert
assert作用是出现计算表达式expression,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort来终止程序运行。
6.拼接:strcat
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
#include <stdio.h>
#include <string.h>//字符串相关的API要包含头文件
#include <assert.h>
//拼接函数三种实现方式
char *myStrcat(char *des,char *src)
{
assert(des != NULL && src != NULL);
char *back = des;
while(*des){
des++;
}
while((*des++ = *src++) != '\0');
*des = '\0';
return back;
}
char *myStrcat2(char *des,char *src)
{
char *back = des;
strcpy(des+strlen(des),src);
return back;
}
char *myStrcat3(char *des,char *src)
{
assert(des != NULL && src != NULL);
char *back = des;
for(;*des!='\0';des++);
while((*des++ = *src++) != '\0');//'\0'判断与*src有关
*des = '\0';
return back;
}
int main()
{
char str[128] ="yingjie";
char *p = "handsome";
char *p2;
//p2 = strcat(str,p);
p2 = myStrcat3(str,p);
//puts(str);
puts(p2);
return 0;
}
7.比较
(1)strcmp:int strcmp(const char *s1,const char *s2);
若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数 。
(2)strncmp:int strncmp ( const char * str1, const char * str2, size_t n );
功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
#include <stdio.h>
#include <string.h>//字符串相关的API要包含头文件
#include <assert.h>
int myStrcmp(char *str1,char *str2)
{
int ret;
int n_str1 = 0;
int n_str2 = 0;
char *backStr1 = str1;
char *backStr2 = str2;
while(*str1 && *str2 && (*str1 == *str2)){
str1++;
str2++;
}
if(*str1 || *str2){
str1 = backStr1;
str2 = backStr2;
while(*str1){
n_str1 += *str1;
str1++;
}
while(*str2){
n_str2 += *str2;
str2++;
}
}
ret = n_str1 - n_str2;
if(ret < 0){
ret = -1;
}
if(ret > 0){
ret = 1;
}
return ret;
}
int main()
{
char *p1 = "ayinbgjie";
char *p2 = "cyinagjie";
int ret = myStrcmp(p1,p2);//-1 1 0
if(ret == 0){
puts("两字符串一样");
}
printf("ret=%d\n",ret);
return 0;
}
8.查找子字符:strchr
char *strchr(const char *str, int c);
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
9.查找子串:strstr
char *strstr(char *str1, const char *str2);
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
10.字符串分割:strtok
char *strtok(char *str, const char *delim);
Notes:(1)分解字符串 str 为一组字符串,delim 为分隔符;
(2)特别要注意分割处理后原字符串 str 会变,原字符串的改动是切分符原位置均更改为 '\0'。