新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
字符数组
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’};
字符串
char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,’ \0’};
字符串变量
char *str = “Hello”;
char word[] = “Hello”;
char line[10] = “Hello”;
“Hello”
″Hello″ 会被编译器变成⼀个字符数组放在某处,这个数组的⻓度是6,结尾还有表⽰结束的0
两个相邻的字符串常量会被⾃动连接起来
⾏末的\表⽰下⼀⾏还是这个字符串常量
C语⾔的字符串是以字符数组的形态存在的
唯⼀特殊的地⽅是字符串字⾯量可以⽤来初始化字符数组
以及标准库提供了⼀系列字符串函数
char* s = "Hello, world!";
字符串赋值?
char string[8];
scanf(“%s”, string);
printf(“%s”, string);
scanf读⼊⼀个单词(到空格、tab或回⻋为⽌)
scanf是不安全的,因为不知道要读⼊的内容的⻓度
安全的输⼊
char string[8];
scanf(“%7s”, string);
在%和s之间的数字表⽰最多允许读⼊的字符的数量,这个数字应该⽐数组的⼤⼩⼩⼀
下⼀次scanf从哪⾥开始?
下一次scanf从上一个第八个开始
常⻅错误
这是⼀个空的字符串,buffer[0] == ‘\0’
char buffer[] = “”;
这个数组的⻓度只有1!
• char **a
• a是⼀个指针,指向另⼀个指针,那个指针指向⼀个字符(串)
• char a[][]
• a是⼀个⼆维数组,第⼆个维度的⼤⼩不知道,不能编译
• char a[][10]
• a是⼀个⼆维数组,a[x]是⼀个char[10]
• char *a[]
• a是⼀个⼀维数组,a[x]是⼀个char*
程序参数
putchar
getchar
strlen
size_t strlen(const char * s);
返回s的字符串⻓度(不包括结尾的0)
char line[]="Hello"
printf("strlen=%lu\n",strlen(line));
printf("sizeof=%lu\n",sizeof(line));
输出结果为:
strlen=5
sizeof=6
strcmp —compare
0:s1>s2
int mycmp(const char *s1,const char *s2)
{
int idx = 0;
while (s1[idx] == s2[idx] && s1[idx] != 0)
{
idx++;
}return s1[idx] - s2[idx];
}
等同于
int mycmp(const char *s1,const char *s2)
{
while (*s1==*s2&&*s1!='\0')
{
s1++; s2++;
}
return *s1 - *s2;
}
strcpy —copy
char * strcpy(char *restrict dst, const char *restrict src);
char *dst = (char*)malloc(strlen(src)+1); //+1包括结尾最后的\0
strcpy(dst, src);
用函数等价
数组版本
char* mycpy(char*dst,const char* src)
{
int idx = 0;
while(src[idx]){
dst[idx]=src[idx];
idx++;
}
dst[idx]='\0';
return dst;
}
指针版本
char* mycpy(char*dst,const char* src)
{
char *ret=dst;
while( *dst++ = *src++ )
;
*dst='\0';
return ret;
}
strcat
char * strcat(char *restrict s1, const char *restrict s2);
char *mycat(char cat1[],const char cat2[]) //声明并实现我的猫字符指针函数。
{ int i = 0;
int j = strlen(cat1); //猫1字符数组的最后一位下标j while(i != strlen(cat2)){ //当猫2的下标为最后一位\0时跳出循环 cat1[j] = cat2[i]; //猫1最后一位为猫二的第一位字符
i++;
j++;
}
cat1[j] = '\0'; //猫1字符数组最后一位为0
return cat1; //让我的猫字符指针指向猫1字符数组
}
安全问题
strcpy和strcat都可能出现安全问题:如果那个dst或者要连接的地方没有足够的空间,不知道是否越界
安全版本
char * strncpy(char *restrict dst, const char *restrict src, size_t n);
char * strncat(char *restrict s1, const char *restrict s2, size_t n);
int strncmp(const char *s1, const char *s2, size_t n);
在名字中间和参数表中多了一个n
n的意思是说你能拷过去多少个字符;多了的部分直接掐掉,不会越界。
对于cmp来说是比较前n个的大小
strchr
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
#include#includeint main ()
{
const char str[] = "http://www.nowcoder.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
运行结果为
|.| 之后的字符串是 - |.nowcoder.com|
strrchr
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
#include#includeint main ()
{
int len;
const char str[] = "https://www.nowcoder.com";
const char ch = '.';
char *ret;
ret = strrchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
运行结果为
|.| 之后的字符串是 - |.com|
strstr()
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
下面是 strstr() 函数的声明。char
*strstr(const
char
*haystack,
const
char
*needle)
#include
#include
int
main()
{
const
char
haystack[20] = "NOWCODERABCD";
constchar
needle[10] = “CODER”;
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n"
, ret);return(0);
}`
输出结果为
子字符串是: CODERABCD
memcpy
和strcpy类似,只不过它是拷贝字节
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧