字符串的实质:以空字符(\0)结尾的char型数组。
程序11.1简单演示一下字符串的操作。
/*string.c---使用字符串与用户交互*/
#include
#define MSG "You must have many talents. Tell me some"
#define LIM 5
#define LINELEN 81
int main(void)
{
char name[LINELEN];
char talents[LINELEN];
int i;
const char m1[40]="Limit yourself to one line`s worth.";
const char m2[]="If you can`t think of anything,fake it";
const char *m3="\nEnough about me -what`s your name";
const char *mytal[LIM]={"Adding","Multiplying","Stashing","Following","Understing"};
printf("Hi!\n");
puts("what were they?");
for(i=0;i
字符串:在内存中是以'\0'
结尾的一串字符,程序中将字符串至于双引号内,编译器自动添加结尾的空字符。
注意:如果想在字符串中使用双引号可以在双引号前面加一个\。请看示例:
printf("\"Run,Spot,run\"");
//该代码输出为 "Run,Spot,run"
字符串为静态存储类(static storage)
程序清单11.2 quotes.c
/*quotes.c--把字符串看作指针*/
#include
int main(void)
{
printf("%s , %p , %c\n","we","are",*"space");
return 0;
}
输出 we 是按字符格式输出
输出 00405064是按地址输出 是字符串 are的地址(将are看成一个指针)
输出 s 是将字符串的地址的内容输出,类似于数组。数组名即指针,字符串即指针 。数组首元素指针首字母就是该指针指向的内容。
请看示例:
const char m1[]="hellow";
const char m1[]={'h','e','l','l','o','w','\o'};//主意‘\0’表明是一个字符串,否则是一个数组
数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是复制字符串的地址。
请看以下两个声明:
char heart[]="I love title";//初始化一个存放字符串的数组 heart 是个常量
char *head="I love title";//初始化一个指向字符串的指针 head是个指针变量
代码1:两者均可以使用数组符号
for(i=0;i<6;i++)
{
putchar(heart[i]);
}
for(i=0;i<6;i++)
{
putchar(head[i]);
}
二者输出结果相同
代码2:两者都可以使用指针加法
for(i=0;i<6;i++)
{
putchar(*(heart+i);
}
for(i=0;i<6;i++)
{
putchar(*(head+i);
}
二者输出结果相同
代码3:只有指针可以使用增量运算符
while(*(head)!='\0')//当前指针指向的内容不是结束符则继续循环
{
putchar(*(head++));//向前推进指针知道结束符退出循环
}
数组元素是变量(除去使用const修饰的情况),数组名不是变量。
推荐用法:`const char *pl=“abcde”;//可以防止通过指针修改字符串内容造成混乱
未完待续。。。。。。。。2019年3月17日 01:38:57`
字符串就是指针,所以字符串数组即成员是指针的数组,所以角标加1则指向下一字符串而不是下一字符。每个指针所指向的内容是该字符串的首字母。
示例代码:
const char *arr[3]={"abc","def","hgi"};
程序11.1 p_and_s.c
/p_and.s.c/
#include
int main(void)
{
char* mesg=“don`t be a fool!”;
char* copy;
copy=mesg;
printf("%s\n",copy);
printf(“mesg=%s;&mesg=%p;vale=%p\n”,mesg,&mesg,mesg);
printf(“copy=%s;©=%p;vale=%p”,copy,©,copy);
return 0;
}
可以看到value两次输出相同,value是指针的值(也就是所指向的字符串的地址)相同。可以得出结论copy=mesg完成的功能是创建第2个指针指向同一个字符串。这样做的好处是不用在开辟一个空间存储拷贝的字符串内容。
建立一个空间存放字符串,才能正常接收到输入的字符串。
char arr[5];//最简单的操作
char* name;
scanf("%s",name);//不合理的操作 name可能指向任何一个地方
gets()通过检测换行字符(回车可以产生)来结束。获取到换行字符前面所有的字母并添加一个空字符’\0’。
程序11.4 name1.c
/*name.c--读取一个名字*/
#include
#define LEN 40
int main(void)
{
char name[LEN];
char *pt_name;
pt_name=name;
printf("what`s your name?\n");
gets(name);
printf("nice name :%s\n",name);
printf("really good name:");
unsigned char i;
while(*(pt_name)!='\0')
{
printf("%c",*pt_name++);
}
return 0;
}
该函数有三个参数:缓存区,最大长度,读哪一文件;其它与gets()类似。
scanf()更多的应用与读取单个字符,gets()更多应用与读取字符串。
使用puts输出字符串很简单,值得主意的是如果输出数组请确保空白字符的存在。
优点是在一行内输出多个字符串变得简单
利用变准输入输出函数重新构造函数
string.h提供了字符串函数的原型:常用的有 strlen() strcat() strnat() strcmp() strncmp()等函数。下面来一一介绍。
请看代码:
/*test.c---缩短字符串*/
#include
#include
# define SIZE 4
void fix(char*,char);
int main(void)
{
char mesg[] = "hello world!";
//char *ptr="hello world";
fix(mesg,SIZE);
puts(mesg);
return 0;
}
void fix(char*string,char size)
{
if(strlen(string)>size)
*(string+size)='\0';
}