C语⾔(⼆)字符数组、字符串、字符指针及字符串常⽤操作⽬录
⼀、字符数组初始化
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1000
int main()
{
char a[MAXSIZE] = { '1','a','2','b' };//1数组指定长度,2⽤字符初始化,3会⾃动补'\0'以结束
char b[] = { '1','a','2','b' }; //1数组不指定长度,2⽤字符初始化,3不以'\0'结束
char c[] = "1233456546";//1数组不指定长度,2⽤字符串初始化,3⾃动补'\0'结束
char d[MAXSIZE] = "1233456546";//1数组指定长度,2⽤字符初始化,3⾃动补'\0'结束
//char e[2] = "fsdf"; //直接报错,长度⾮法
char f[2] = "fs"; //不会报错,但不⾃动添加'\0',因为没有空间
printf("strlen(a):%d\tsizeof(a):%d\ta:%s\n", strlen(a), sizeof(a), a);
printf("strlen(b):%d\tsizeof(b):%d\tb:%s\n", strlen(b), sizeof(b), b);
printf("strlen(c):%d\tsizeof(c):%d\tc:%s\n", strlen(c), sizeof(c), c);
printf("strlen(d):%d\tsizeof(d):%d\td:%s\n", strlen(d), sizeof(d), d);
printf("strlen(f):%d\tsizeof(f):%d\td:%s\n", strlen(f), sizeof(f), f);
return 0;
}
strlen()——C语⾔string.h中的函数,遇'\0'截⽌,但统计长度并不包括'\0',只统计⾮'\0'的字符个数
sizeof()——C语⾔运算符,计算()内的变量所属数据类型所占内存的字节数
1. sizeof(a):1000
sizeof(b):4
sizeof(c):11
sizeof(d):1000
2. a d为指定长度数组,故统计结果为数组长度1000;
3. b以省略长度⽅式书写,编译器将初始化的字符个数指定为其长度,故sizeof(b)=4;
4. c以省略长度⽅式书写,字符串⽅式初始化,末尾⾃动追加'\0',统计时包含该'\0',故sizeof(c)=11
⼆、数组名不允许⾃加⾃减
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char b[] = { '1','a','2','b' };
b++;//⾮法操作
b--;//⾮法操作
return 0;
}
error C2105: '++' needs l-value
原因:数组名代表数组的⾸地址(⽽⾮整个数组的地址),⼀旦定义,则不允许修改其值(常指针):在main函数执⾏完成,操作系统将释放内存。如果更改值,使他指向其他地⽅,则释放内存必然出错。故为保证释放的内存安全,数组⾸地址不允许改变
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char b[] = { '1','a','2','b' };
char *p = NULL;
p = b;
p++;
return 0;
}
三、字符串操作内存⽰意图
四、字符串拷贝函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
src 源字符串
dst ⽬标地址
*/
int str_copy1(char *dst, char *src)
{
for (; *src != '\0'; src++, dst++)
{
*dst = *src;
}
*dst = '\0';
return 0;
}
int str_copy2(char *dst, char *src)
{
for (; *src != '\0';)
{
*dst++ = *src++; // *dst = *src, dst++, src++ }
return 0;
}
int str_copy3(char *dst, char *src)
{
// src: "1234567\0"
// dst:  1234567\0
for (; (*dst = *src) != '\0'; )
{
src++;
dst++;
}
return 0;
}
int str_copy4(char *dst, char *src)
{
// for (; (*dst++ = *src++););
while ((*dst++ = *src++));
return 0;
}
int str_copy5(char* const dst, char* const src)
{
//传址调⽤时,不要轻易改变形参指向,可引⼊⼀辅助指针变量,将形参值接过来 char* tmpdst = dst;//1
char* tmpsrc = src;//2
if (tmpdst == NULL || tmpsrc == NULL) //增加判断,防⽌向(从)空地址拷贝字符  return -1;
while ( *tmpdst++ = *tmpsrc++ );
printf("%s\n", dst);//如果没有1 2 直接修改指针所指内容,会出错。
printf("%s\n", src);//如果没有1 2 直接修改指针所指内容,会出错。
return 0;
}
//    0x00000000 ---> NULL  --->  0
//    '\0' --->  0
//    '0' ---> 48
int main(void)
{
char *str = "123456789";
char dst[128] = { 0 };
/
/char *dst = NULL;
if( str_copy5(dst, str) )
printf("str_copy5(dst, str) error!\n");
printf("dst:%s\n", dst);
return 0;
}
NULL  --->  0
'\0' --->  0
'0' ---> 48
五、求字符串中某⼀⼦串出现的次数
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
c语言如何创建字符串数组#include <string.h>
#include <stdlib.h>
//strstr(母串,⼦串)
//统计⼦串在母串的个数
int get_sub_str_count(char *src, char *sub_str)
int cnt = 0;
if (src == NULL || sub_str == NULL)
{
fprintf(stderr, "(src == NULL || sub_str == NULL\n");
return -1;
}
while ((p = strstr(p, sub_str)) != NULL)
{
//到了⼦串
cnt++;
p += strlen(sub_str);
if (*p == '\0')
break;
}
return cnt;
}
int get_sub_str_count2(char *src, char *sub_str, int *cnt_p)
{
char *p = src;
int cnt = 0;
if (src == NULL || sub_str == NULL)
{
fprintf(stderr, "(src == NULL || sub_str == NULL\n");
return -1;
}
while ((p = strstr(p, sub_str)) != NULL)
{
/
/到了⼦串
cnt++;
p += strlen(sub_str);
if (*p == '\0')
break;
}
*cnt_p = cnt;
return 0;
}
int main(void)
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123itcast"; char *sub_str = "itcast";
int cnt = 0;
cnt = get_sub_str_count(str, sub_str);
if (cnt < 0)
{
fprintf(stderr, "get_sub_str_count err\n");
return -1;
}
printf("cnt  = %d\n", cnt);
cnt = 0;
if (get_sub_str_count2(str, sub_str, &cnt) < 0)
{
fprintf(stderr, "get_sub_str_count2 err\n");
return -1;
}
printf("cnt  = %d\n", cnt);
return 0;
}
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123itcast";
char *sub_str = "itcast";
char *p = str;
int cnt = 0;
while ((p = strstr(p, sub_str)) != NULL)
{
//到了⼦串
cnt++;
p += strlen(sub_str);
if (*p == '\0') {
break;
}
}
printf("cnt = %d\n", cnt);
return 0;
}
#endif
#if 0
//查⼦串 do-while
int main(void)
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123";
//                                                ↑
char *sub_str = "itcast";
char *p = NULL;
int cnt = 0; //统计的个数
p = str;
//do -while
do {
p = strstr(p, sub_str);
if (p != NULL) {
//到了⼀个
cnt++;
p++;
}
} while (p != NULL);
printf("cnt = %d\n", cnt);
return 0;
}
#endif
六、删除给定字符串中的空格
有⼀个字符串开头或结尾含有n个空格(”  abcdefgdddd    ”),欲去掉前后空格,返回⼀个新字符串。
要求1:请⾃⼰定义⼀个接⼝(函数),并实现功能;
要求2:编写测试⽤例。
提⽰:int trimSpace(char *inbuf, char *outbuf);
⽅式1:当字符不为结束符时,从头到尾扫描,遇⾮空格则拷贝(可删除字符串中所有空格)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。