字符串可以用数组(指针常量)或指针变量表示,如下:
char *str1=”hello world”; //事实上是把字符串的地址赋给指针或变量
char str2[12]=”hello world”; //注意 数组只能在定义时赋初值。若写成char str2[12]; str2[12]="hello world";是错误的。
键盘输入:
char *str3;
char str4[20];
str3 = "Iwant to buy iPad\n";//可以把字符串地址赋给变量
scanf("%s",str4);
str3是指针变量,不可以由输入的方式来完成赋值,指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误,故不能用键盘输入。
str4是一个数组,它是指针常量,所以str3已经在固定的地址,不可以再把一个字符串地址赋值给它。
输出:
printf("%s\n", str2); // %s 地址
printf("%s\n", str2);
for(i=0;*str!=’\0’;i++)
{
Printf(“%c”,*str);
str++; //*(str++)//*str++
}
常用的字符串函数
头文件string.h
1 字符串的长度表示此字符串有多少个字符,不包括空字符(‘\0’)结束符,但是包括空格字符等。计算字符串长度的函数为strlen(str1);
int stringLength(char *p)
{
int t=0;
while(*p!=’\0’) //空字符是字符串的终止符;
{
t++;
p++;
}
}
2 字符串的拷贝库函数为strcpy(str1,str2),表示从str2字符串的第一个字符,逐一地复制到str1字符串。
void myStringCopy(char *dest, char *source )
{
while((*dest= *source)!=’\0’) //表达式的值即为*dest更新的值
{ //先复制,再判断是不是结束符---精炼表达
source++;
dest++;
}
}
如只需要拷贝n个字符时。。。。。。
void myStringCopy_n(char *dest, char *source ,int n)
{
int i=1;
while((i<=n)&&(*dest=*source)!=’\0’)
{
source++;
dest++
}
}
3 字符串的连接
库函数strcat(str1,str2)将str2字符串拷贝到str1字符串的尾端。注意,str1必须要分配足够的空间
void my_strcat(char *str1,char *str2)
{
while(*str1!='\0')
str1++;
while((*str1=*str2)!='\0')
{
str1++;
str2++;
}
}
如果只需要连接n个字符,则可调用库函数strncat.
strncat(str1,str2,n);
意思是将str2的前n个字符连接到str1;
void my_strncat(char *str1,char *str2,int n)
{
int i=1;
while(*str1!='\0')
str1++;
while((i<=n)&&(*str1=*str2)!='\0')
{
str1++;
str2++;
i++;
}
}
4 字符串的比较
库函数 strcmp(str1,str2);
void my_strncat(char *str1,char *str2,int n)
{
int i=1;
while(*str1!='\0')
str1++;
while((i<=n)&&(*str1=*str2)!='\0')
{
str1++;
str2++;
i++;
}
}
若只要比较前面几个字符串
int my_strcmp(char *str1,char *str2,int n)
{
int i;
for(i=1;(*str1==*str2)&&i++<=n;str1++,str2++)
if(*str1==’\0’)
return 0;
return *str1-*str2;
}
若比较两字符串且忽略大小写的差异,则可编写程序如下:
intstringIgnoreCompare(char *x, char *y)
{
while(*x== *y || *x-32 == *y || *x == *y-32)
{
if(*x== '\0')
return0;
x++;
y++;
}
return*x-*y;
}