字符串
定义的几种格式
和整型数组略像 char str[] = “abcdefghijklnmopq”;
一般用char *p =“hello”
字符数组的存储方式
不能用sizeof来计算字符串中的有效个数(比实际多一个)
应该用strlen 在计算字符串个数时 遇到’\0’ 就结束计数
几种常用的API
1.输出字符串
puts();
printf("%s",p);
2.获取字符串
gets();
scanf("%s",p)
3.计算长度
strlen
4.初始化
memset
5.拷贝
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
6.拼接
char *strcat(char *dest, const char *src);
7.比较
int strcmp(const char *s1, const char *s2);//相同输出0
8.查找子字符
char *strchr(const char *s, int c);
9.查找子串
char *strstr(const char *haystack, const char *needle);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstr;// 野指针 造成段错误 要进行初始化
pstr = (char *)malloc(128); // 申请空间
memset(pstr, '\0', 128); // 初始化
printf("请输入字符串\n");
gets(pstr);
puts(pstr);
int a = strlen(pstr);
printf("字符串的长度:%d\n",a);
// char *strcpy(char *dest, const char *src);
char *strDest;
strDest = (char *)malloc(128); // 申请空间
memset(strDest, '\0', 128); // 初始化
strcpy(strDest,pstr);
printf("复制的字符串:%s\n",strDest);
//char *strncpy(char *dest, const char *src, size_t n);
memset(strDest, '\0', 128);
int b;
printf("复制前几个字符串:\n");
scanf("%d",&b);
strncpy(strDest, pstr, b);
printf("复制的字符串:%s\n",strDest);
// char *strcat(char *dest, const char *src);
char *str = "lrm hen shuai";//只能进行读操作 不能写操作 否则段错误
// strcat(str ,strDest);
strcat(strDest, str);
printf("组合后的字符串:%s\n",strDest);
// int strcmp(const char *s1, const char *s2);
if(strcmp(str, pstr) == 0){
printf("相同哦\n");
}else{
printf("不相同哦\n");
}
// char *strchr(const char *s, int c);
char *pstr2;
pstr2 = (char *)malloc(128);
memset(pstr2, '\0', 128);
pstr2 = strchr(str, 'r');
puts(pstr2);
char *pstr3;
pstr3 = (char *)malloc(128);
memset(pstr3, '\0', 128);
// char *strstr(const char *haystack, const char *needle);
char *s = "hen";
pstr3 = strstr(str,s);
puts(pstr3);
return 0;
}
10.转为小写的函数
strlwr
11.转为大写的函数
strupr
char str1[] = "Hello World";
puts(strlwr(str1));
puts(strupr(str1));
12.字符串分割
strtok
第一个 子串 strtok(str," “);
之后的子串 strtok(NULL,” ");
#include <stdio.h>
#include <string.h>
// char *strtok(char *str, const char *delim);
int main()
{
char str[128] = "lin rui miao";
int i = 1;
char *psubs[10];
char *p = NULL;
p = strtok(str," ");
if(p != NULL){
printf("获取到第1个串p=%s\n",p);
psubs[i-1] = p;
}
while(1){
p = strtok(NULL," ");
if(p != NULL){
i++;
printf("获取到第%d个串p=%s\n",i,p);
psubs[i-1] = p;
}else{
printf("没有子串了\n");
break;
}
}
int j;
for(j=0;j<i;j++){
puts(psubs[j]);
}
return 0;
}
自己实现一些api
gets puts strlen memset
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myputs(char *p)
{
while(*p != '\0'){
putchar(*p++);
}
}
int mygets(char *p)
{
int cnt = 0;
if(p == NULL){
printf("输入非法\n");
return cnt;
}
while(*p = getchar()){
if(*p == '\n'){
return cnt;
}else{
cnt++;
p++;
}
}
}
int mystrlen(char *p)
{
int cnt = 0;
while(*p != '\0'){
cnt++;
p++;
}
return cnt;
}
void mymemset(char *p,char c, int size)
{
while(size){
*p++ = c;
size--;
}
}
int main()
{
char *p;
int a;
p = (char *)malloc(128);
mymemset(p, '\0', 128);
char a1[128] = "linruimiao";
a = mygets(p);
myputs(p);
a = mystrlen(a1);
printf("%d\n",a);
return 0;
}
strcpy strncpy strcat strcmp
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *myStrcpy(char *str, const char *p)
{
if(p == NULL || str == NULL){
return NULL;
}
while(*p != '\0'){
*str++ = *p++;
}
return str;
}
char *myStrncpy(char *str, const char *p, int size)
{
if(p == NULL || str == NULL){
return NULL;
}
while(*p != '\0' && size > 0){
*str++ = *p++;
size--;
}
return str;
}
char *myStrcat(char *dest, const char *src)
{
while( *dest != '\0'){
dest++;
}
while(*src != '\0'){
*dest++ = *src++;
}
return dest;
}
int myStrcmp(char *a,char *b)
{
if((NULL == a) || (NULL == b))
{
return -1;
}
while(*a== *b)
{
if(*a == '\0')
{
return 0;
}
a++;
b++;
}
return *a-*b;
}
int main()
{
char *p = "linruimiao";
char str[128] = {'\0'};
// myStrcpy(str,p);
myStrncpy(str,p,3);
puts(str);
char *a = "123";
strcat(str,a);
printf("组合后的字符串:%s\n",str);
char *b = "12";
int q = myStrcmp(b,a);
if(q == 0){
printf("相同哦\n");
}
printf("q=%d\n",q);
return 0;
}
strchr strstr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *myStrchr(char *str1, char c)
{
while (*str1 != '\0')
{
if (*str1 == c)
{
return str1;
}
else
{
str1++;
}
}
}
char *myStrstr(char *s1, char *s2)
{
char* p=s1;
char *r=s2;
while(*p != '\0')
{
while(*p == *r)
{
p++;
r++;
}
if (*r == '\0')
return s1;
else{
r=s2;
p=++s1;
}
}
return NULL;
}
int main()
{
char *str = "linruimiao hen shuai";
char *p;
char *s = "rui";
p = (char *)malloc(128);
memset(p, '\0', 128);
// p = myStrchr(str, 'r');
p = strstr(str,s);
puts(p);
}
~