本文主要内容
【C语言敲重点(二)】字符串的那点小事儿
一、区分三种字符串声明的方式
(1)char str[ ] = {‘h’,‘e’,‘l’,‘l’,‘o’};
(2)char *str = “hello”;
(3)char str[ ] = “hello”;
-
定义方式:(1)字符数组;(2)指向字符串常量的指针;(3)字符串字面量(字符串常量)
(2)仅声明了一个指针变量指向字符串hello,而该字符串存放在常量区,不允许被修改
-
一道小面试题:(D)
-
以下这种写法才是正确修改字符串的打开方式
不同于上面的char *str = "Hello";char str[ ]=“Hello world"这种声明编译器会给数组在栈中分配内存空间,并将字符串存入数组的可修改地址中
二、字符串的必记的小点
- 结束标志:‘\0’:sizeof( )值记得加上1;strlen( )计算的是字符串有效字符长度,'\0’忽略。
- 动态开辟字符串:malloc( )、realloc( )、free( )。
记得回收资源
- 常用操作字符串函数:①拷贝strcpy( )\strncpy( );②拼接strcat( );③比较strcmp( );
三、常见面试题
(1)自己实现字符串拷贝函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *myStrcpy(char *dest,const char *src){
//const修饰,src不可变(加分)
char *temp = dest; //保存目标字符串,作为返回值,使函数可以作为其他函数的参数传入(加分)
if(src == NULL || dest == NULL){
//NULL判断(加分)
return NULL; //写法有很多,选择容易理解的即可
}
while (*src != '\0'){
*dest++ = *src++;
}
*dest = '\0'; //加上结束标志
return temp;
}
char *myStrncpy(char *dest,const char *src,size_t size){
//const修饰,src不可变(加分)
char *temp = dest; //保存目标字符串,作为返回值,使函数可以作为其他函数的参数传入(加分)
if(src == NULL || dest == NULL){
//NULL判断(加分)
return NULL; //写法有很多,选择容易理解的即可
}
while (*src != '\0' && size-- > 0){
*dest++ = *src++;
}
*dest = '\0'; //加上结束标志
return temp;
}
int main(){
char *str1 = "myStringCopy";
char *str2 = (char *)malloc(strlen(str1));
char *str3 = (char *)malloc(strlen(str1));
myStrcpy(str2,str1);
printf("%s\n",str2);
printf("%s\n",myStrcpy(str2,str1)); //返回值的意义
myStrncpy(str3,str1,8);
puts(str3);
return 0;
}
- C语言断言函数assert( ):作用是计算表达式,如果为假,它会向标准错误stderr打印错误信息并调用abort终止程序,断言有一定的缺点就是频繁调用造成额外开销影响性能。
(2)自己实现字符拼接函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
char *myStrcat(char *dest,const char *src){
char *temp = dest;
assert(dest != NULL && src != NULL ); //断言
char *destAppendPos = dest + strlen(dest); //末尾地址
while (*src != '\0'){
*destAppendPos++ = *src++;
}
*destAppendPos = '\0';
return temp;
}
int main(){
char str1[] = "String1";
char str2[] = "String2";
myStrcat(str1,str2);
printf("%s\n",str1);
return 0;
}