#pragma mark - 字符串常量
void charPointer()
{
//(一)字符串常量属于静态存储类,如果一个函数中使用字符串常量,即使多次调用该函数,字符串在整个程序运行过程中保存一份
char *c1 = "aaa";
char c2[] = "aaa";
//"aaa" 引号中内容作为指向该字符串的指针
printf("%p %p","aaa",&c1);
char *c3[] = {"abd","deb"};
printf("%s\n %p\n %c\n","hello","how",*"are you"); //字符串的*取值就是指针地址
printf("c3[0]==%s c3[0]的第一个字符%c\n",c3[0],*c3[0]); //数组下标的*取值 对应字符串的首字符 等同于 c3[0][0]
}
#pragma mark - 字符串函数
int codeForChar()
{
char *c1 = "asdfghjk";
char c2[] = "hgfdsa";
char c3[80] = "ssss";
char c4[] = "hgfdaa";
//(一)strlen 字符串长度
size_t t1 = strlen(c1);
size_t t2 = strlen(c2);
unsigned int num = 5;
//例:结合strlen改变数组元素值
int a = changeChar(c2, num);
//(二)strcat 拼接字符数组,c2拼接到c3后面,c2值不变
strcat(c3, c2);//c3必须数组长度足够容纳新的元素个数+1
//strncat 拼接字符数组,要先计算c3除 '\0'外最大可容纳长度
unsigned long avi = (10 - strlen(c1)-1);
strncat(c3, c2, avi);
//(三)strcmp 字符串值比较,成功返回0, 不相等返回非0值
int isSame = strcmp(c2, c4);//参数是两个指针
//strncmp 限定搜索指定范围的字符串匹配
int isCmpSame = strncmp(c2, c4, 4);//匹配前四个元素
//(四)strcpy 字符串拷贝 第二参数支持字符串 字符指针数组 往第一参数copy赋值
printf("输入要拷贝字符\n");
char temp[20] = "Rrrrrreee";
char *apm = "123456789101";
// strcpy(&temp[2], apm);
printf("temp point %p apm point %p",temp,apm);
printf("temp %s apm %s",temp,apm);
/*
temp point 0x7fff5fbff6e0 apm point 0x100000f28
temp Rr123456789101 apm 123456789101
*/
//strncpy 较为安全的字符串复制方法,指定最大复制数
size_t t = strlen(temp);
strncpy(temp+t, apm, 20-t);
printf("\n");
puts(temp);
printf("end");
/*
Rrrrrreee12345678910
*/
//(五)sprintf 拼接自定义字符串元素(可以是多种数据类型)
char first[k_MAX] = "JASONS";
char last[k_MAX] = "And Timi";
char formal[2*k_MAX+12];
double prize = 3389.22f;
sprintf(formal, "%s %-10s %lf",first,last,prize);
puts(formal);
/*
JASON And Timi 3389.219971
*/
//(六)strchr 匹配字符元素是否存在,如果存在返回该字符的首地址指针,如果不存在返回NULL
char *chr = strchr(first, 'S');
puts(chr);
printf("%p",&chr);
//(七)strpbrk 依次检验字符串first中的字符,当被检验字符在字符串last中也包含时,则停止检验,并返回该字符位置,空字符null不包括在内。
//first = "JASON" last = "And Timi"
char *chr2 =strpbrk(first, last);
puts(chr2);
/*
ASON
*/
//(八)strrchr 搜索字符last最后出现在first的位置,如果不存在返回NULL
char *chr3 = strrchr(first, 'N');
puts(chr3);
/*
NS
*/
return 0;
}
//更改字符
int changeChar(char *string, unsigned int num)
{
if (strlen(string)>num)
{
*(string+num) = '\0';
}
return 0;
}
//字符串转大字、标点符号计算
void bigCharAndPun()
{
char norChar[] = "Here is China, I wait for you.....";
bigChar(norChar);
puts(norChar);
int num = punctuation(norChar);
printf("标点符号个数=%d\n",num);
}
#pragma mark - 字符串转大写 toupper
int bigChar(char *bigC)
{
while (*bigC) {
*bigC = toupper(*bigC);
bigC++;
}
return 0;
}
#pragma mark - 计算字符串中标点符号个数 ispunct
int punctuation(const char *pun)
{
int numOfPun = 0;
while (*pun) {
if (ispunct(*pun))
{
numOfPun++;
}
pun++;
}
return numOfPun;
}
//字符串排序
int sortCode()
{
char *a[] ={"jj","abe","cat","timi","done"};
printf("原来的序列是:\n");
print(a);
sort(a);
printf("\n排序后的序列是:\n");
print(a);
printf("\n\n");
return 0;
}
#pragma mark - 字符串排序
void sort(char *a[])
{
int i,j;
char *temp;
for(i=0;i<4;i++)//注意是i<4
{
for(j=0;j<4;j++)//注意是j<4,因为下面要+1和后面的那个字符串比较
{
if(strcmp(a[j],a[j+1])>0)//字符串比较:>0表示前面的字符串比后面的大则交换
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void print(char *a[])
{
int i;
for(i=0;i<5;i++)
{
printf("%s ",a[i]);
}
}