一、字符串的模样
char arr[10]={'a','b','c'};//剩余部分为‘/0’,是字符串
char brr[]={'a','b','c'};//没有‘\0’,是字符数组,不是字符串
char crr[10]={"abc"};//字符数组特有,是字符串
char drr[10]="abc";//字符数组特有,是字符串
char err[]="abc";//字符数组特有,是字符串
char frr[10]="";//字符串里由10个‘\0’,是字符串
char brr[]={'a','b','c'};//没有‘\0’,是字符数组,不是字符串
char crr[10]={"abc"};//字符数组特有,是字符串
char drr[10]="abc";//字符数组特有,是字符串
char err[]="abc";//字符数组特有,是字符串
char frr[10]="";//字符串里由10个‘\0’,是字符串
总之呢,字符串以“ ”号包括的字符序列,带‘\0’,而字符串的结尾标记就是‘\0’,只要有‘\0’的都是字符串。
二、字符串的操作
(1)字符串复制
#include <stdio.h>
void Mystrcpy(char *des, char *str)
{
int i;
for(i = 0;str[i] != '\0';i++)
{
des[i] = str[i];
}
des[i] = '\0';
printf("%s\n",des);
}
{
int i;
for(i = 0;str[i] != '\0';i++)
{
des[i] = str[i];
}
des[i] = '\0';
printf("%s\n",des);
}
int main()
{
char str[]={"asdf"};
char des[10];
Mystrcpy(des,str);
}
{
char str[]={"asdf"};
char des[10];
Mystrcpy(des,str);
}
(2)字符串的连接
void Mystrcat(char des[],char str[])
{
int i,j;
i=0;
j=0;
while(des[i]!='\0')
{ i++; }
while(str[j]!='\0')
{ des[i++]=str[j++];}
des[i]='\0';
{
int i,j;
i=0;
j=0;
while(des[i]!='\0')
{ i++; }
while(str[j]!='\0')
{ des[i++]=str[j++];}
des[i]='\0';
}
int main()
{
char des[]={"absdf"};
char str[]={"eyreu"};
Mystrcat(des,str);
printf("%s\n",des);
return 0;
}
(3)字符串的比较
int main()
{
char des[]={"absdf"};
char str[]={"eyreu"};
Mystrcat(des,str);
printf("%s\n",des);
return 0;
}
#include <stdio.h>
#include <string.h>
int Mystrcmp(char *des,char *src)
{
int i=0;
while(*(des+i) == *(src+i))
if(*(des+i++) < '\0')
return 0;
return (*(des+i)-*(src+i));
}
#include <string.h>
int Mystrcmp(char *des,char *src)
{
int i=0;
while(*(des+i) == *(src+i))
if(*(des+i++) < '\0')
return 0;
return (*(des+i)-*(src+i));
}
int main()
{
char str1[10] = {"abcde"};
char str2[10] = {"abcd"};
char str3[10] = {"abc"};
char str4[10] = {"abc"};
printf("%d\n",Mystrcmp(str1,str2));
printf("%d\n",Mystrcmp(str3,str4));
return 0;
}
{
char str1[10] = {"abcde"};
char str2[10] = {"abcd"};
char str3[10] = {"abc"};
char str4[10] = {"abc"};
printf("%d\n",Mystrcmp(str1,str2));
printf("%d\n",Mystrcmp(str3,str4));
return 0;
}
三、字符串的两面
char *str1 = "abcde";//字符串常量,不允许修改
char str2[] = "abcde";//字符数组,有\0,所以也是字符串
str1[0] = 'x';//试图修改字符串常量的值,写错误str2[0] = 'x';
strcpy(str1,"xyz"); //error
把str1复制成为“xyz”,但str1是字符串常量不允许修改
strcpy(str2,"hello world");//error 越界,因为str2仅占6个字节
解:字符串崩溃原因:
(1)试图修改字符串常量的值
(2)越界
int main()
{
char str1[10];
gets(str1);//危险,越界,建议使用fgets()
printf("str1=%s\n",str1);
return 0;
}
附加:
字符串sizeof 和
strlen 的区别
int main()
{
char str1[100] = "abcde";//100,5 指定了数组大小,所以所占字节为100,字符串长度为有效长度不包含'\0',所以长度为5
char str1[100] = "abcde";//100,5 指定了数组大小,所以所占字节为100,字符串长度为有效长度不包含'\0',所以长度为5
char str2[] = "abcde";//6,5
没有指定大小,所占字节为6长度为5
char str3[100] = "abcdef\0ijk\n";//100,6
指定了数组大小,所以所占字节为100,求字符串长度时,遇'\0'结束,所以长度为6
char str4[] = "abcdef\0ijk\n";//12,6 算所占字节大小时,不以'\0'为结束标志,切勿忘记字符串自带的'\0',所以字节大小为12
char *str5 = "abcde";//4,5 定义了一个指向字符串的指针,指针所占字节为4
char *str6 = "abcdef\0ijk\n";//4,6 同上
printf("%d,%d\n",sizeof(str1),strlen(str1));
printf("%d,%d\n",sizeof(str2),strlen(str2));
printf("%d,%d\n",sizeof(str3),strlen(str3));
printf("%d,%d\n",sizeof(str4),strlen(str4));
printf("%d,%d\n",sizeof(str5),strlen(str5));
printf("%d,%d\n",sizeof(str6),strlen(str6));
return 0;
}