1、字符串
普通方式:char a[] = "ABC";
指针方式:char *pchar = "ABC";
#include <stdio.h>
int main()
{
/*
char a[] = "ABC";
int i;
for(i=0;i<4;i++)
{
printf("%c",a[i]);
}
*/
//指针方式
char *pchar = "ABC";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(pchar+i));
}
//字符串输出采用下面的方式,%s
printf("%s\n",pchar);
putchar('\n'); //此括号内为单引号!!!
puts(pchar);
}
char a[] = "ABC"; 与 char *pchar = "ABC"; 的区别:
前者为字符串变量,可以修改;后者为字符串常量,只能使用,不可修改。
2、 字符串的结束标志:'\0'
3、sizeof 与 strlen 的区别
strlen:计算有效字符的大小
#include <stdio.h>
#include <string.h>
void test()
{
}
int main()
{
char a[128] = "Hello";
printf("sizeof = %d",sizeof(a)); //128
printf("strlen = %d",strlen(a)); //5
char *p = "hello";
//p是一个char *(char型指针),sizeof来计算的时候,得出的是计算机用多少字节来表示一个地址
printf("sizeof(p): %d\n",sizeof(p)); //8
printf("sizeof(char *): %d\n",sizeof(char *)); //8
printf("sizeof(char): %d\n",sizeof(char)); //1
printf("strlen: %d\n",strlen(p)); //5
void (*ptest)();
ptest = test;
printf("sizeof:ptest %d\n",sizeof(ptest)); //8
}
4、动态开辟字符串空间
①malloc
—函数原型 void *malloc(size_t size)
—C库函数void *malloc(size_t size)分配所需的内存空间,并返回一个指向它的指针
②realloc
—函数原型 void *realloc(void *ptr,size_t size)
—扩容
—C库函数 void *realloc(void *ptr,size_t size)尝试重新调整之前调用malloc或calloc所分配的ptr指向的内存块的大小
③free
—C库函数 void free(void *ptr)释放之前调用calloc、malloc或realloc所分配的内存空间
—释放,防止内存泄漏
—防止悬挂指针(野指针的一种)
④strcpy与strncpy
—拷贝
—strcpy函数原型 char *strcpy(char *dest,const char *src);(目标地址,内容地址)
—strncpy函数原型 char *strncpy(char *dest,const char *src,int n);(目标地址,内容地址,拷贝几个字符)
⑤memset
—清理malloc所申请的空间
—函数原型 void *memset(void *str,int c,size_t n);
—eg:memset(p,'\0',10);参考下例,把第二次malloc的空间全部初始化为\0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *p;//野指针,未知指向
p = (char *)malloc(1);//p有了具体的内存指向
*p = 'a';
free(p);//释放
p = (char *)malloc(10);//重新分配10个
printf("扩容前地址:%x\n",p);
int len = strlen("wahaha87463849282368429429");//计算所需大小
int newlen = len - 10 + 1;//计算需要扩容多少,加一是为了给结束标志\0
realloc(p,newlen);//扩容操作
printf("扩容后地址:%x\n",p);
strcpy(p,"wahaha87463849282368429429");//拷贝
puts(p);
return 0;
}
悬挂指针:指针所指向的对象已经被释放或者回收了,但是指向该对象的指针没有作任何的修改,仍旧指向已经回收的内存地址。
5、字符串常用API
①输出字符串
—puts(" ");
—printf("%s",p);
②获取字符串
—char *gets(char *str);
—scanf("%s",p);
③断言(assert)
④拼接(strcat)
—函数原型 char *strcat(char *dest,const char *str);
—把src所指向的字符串(包括"\0")复制到dest所指向的字符串后面(删除*dest原来末尾的"\0")。要保证*dest足够长,以容纳被复制进来的*src。*src中原来的字符不变,返回指向dest的指针。
#include <stdio.h>
#include <string.h>
int main()
{
char str[33] = "欢迎";
char *p = "光临";
strcat(str,p);
puts(str);
return 0;
}
⑤比较
—strcmp函数原型 int strcmp(const char *str1,const char *str2);
—若str1 = str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
—strncmp函数原型 int strncmp(const char *str1,const char*str2,size_t n);
—把str1与str2比较,最多比较前n个字节,若str1与str2的前n个字节相同,则返回0;若str1>str2,则返回大于0的值;若str1<str2,则返回小于0的值。