字符串的处理:
1、C程序员定义字符串的方式有三种:
1) 字符串字面值:”abc”
2) 字符数组:char buf[50];
3) 字符指针:char *str;
2、数组可以看成常指针(不可以改变地址,只能初始化)。某些时候和指针有区别(比如使用sizeof的时候)。
3、memset函数可以清理字符数组,包括变长数组。
4、实例:
/*
字符串的处理
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
/* (1) 赋值 */
//字符串赋值,赋值改变的是地址,而strcpy改变的是值
char* s1 = "abc";
char s2[10] = "abc";
s1 = "abc"; //正确,地值可以修改
//strcpy(s1,"123"); //错误,修改只读区
//s2 = "123"; //错误,数组是一个常指针,不可以改变地址
strcpy(s2,"123"); //正确,值可以修改
char* s3 = (char *)malloc(10);
strcpy(s3,"abc");
//s3 = "123"; //错误,改变了地址,使其指向只读区,free会失败
printf("%s\n",s3);
free(s3);
/* (2) 字符串的长度,字符串的长度strlen(),buf的大小sizeof */
char buf[50] = "abc";
printf("strlen(buf) = %d, sizeof(buf) = %d\n",strlen(buf),sizeof(buf));
/* (3) 字符串的比较,==比的是地址,strcmp比的是值 */
char* s4 = "abc";
char* s5 = "abc";
printf("%d\n",s4==s5); //比较的是一个地址,而不是字面值
printf("%d\n",strcmp(s4,s5)); //比较的是字面值,而不是地址
char s6[10] = "abc";
char s7[10] = "abc";
printf("%d\n",s6==s7);
printf("%d\n",strcmp(s6,s7));
/* (4) 用指针操作字符串 */
char* s8 = "zhangfei,zhang123";
int len = strlen(s8);
char name[len];
char passwd[len];
//清空姓名和密码的缓冲区
memset(name,0,len);
memset(passwd,0,len);
int i = 0, flag = 0, pos = 0;
for(i = 0; i < len; i++)
{
if(*(s8 + i) == ',')
{
flag = 1;
pos = i;
continue;
}
if(!flag)
{
name[i] = *(s8 + i);
}
else
{
passwd[i-pos-1] = *(s8 + i);
}
}
printf("name:%s, passwd:%s\n",name,passwd);
/* (5)字符串的拼接 */
char fpath[50] = "/home/andy/C++/day026";
char fname[50] = "stf.txt";
char pname[100] = {};
/*方法一
strcpy(pname,fpath);
strcat(pname,"/");
strcat(pname,fname);
printf("pname:%s\n",pname);
*/
//方法二
sprintf(pname,"%s/%s",fpath,fname);
printf("pname:%s\n",pname);
/* (6) 字符串和其他类型的转换 */
//其他类型转换成字符串
int x = 100;
char bufx[10] = {};
sprintf(bufx,"%d",x);
printf("bufx = %s\n",bufx);
//字符串转换成其他类型
int y = 0;
sscanf(bufx,"%d",&y);
printf("y = %d\n",y);
/* 总结:处理字符串大部分使用字符串处理函数更好,只有少部分例外 */
return 0;
}