有关字符串的再次认识与深度理解

字符串的多重角度(重点指针与数组,与相关函数)

  1. 字符串定义(字符串是以空字符(\0)结束的char类型数组)
    (与数组和指针运用的输入与输出) (伪代码)char str[]={“engineer”};还有两种赋值形式:
    char str[]=“engineer”;或者char str[]={‘e’,‘n’,‘g’,‘i’,‘n’,‘e’,‘e’,‘r’,} ;
    char *str2={“engineer”};
    如果要改用定义数组大小,使之大小为常量,则此处应该定义为char str[9]={“engineer”};
    其中指针的形式,可以更改指针所指向的内容:如可以改为
    str2=“student”;并且可以
    而所定义的数组名str[]中的str不可利用地址的加减,
    因为在第一次定义之后就认为此中的str为常量。
    输出的时候可以如下写:
    printf("%s",str);
    puts(str);

注意事项:经常犯的错误char *p;*p=‘c’;这样是错误的,因为p未被初始化,其值是一个随机值,所以不知道‘c’会储存在哪里,可能会有错误,也可能没有错误,做好不要这样写。

定义多个字符串数组
char *str[lim]={“I love rongrong”,“compter science”,“Beijing university”,“China is my hometown”};
char ptr[lim][slen]={“I love rongrong”,“compter science”,“Beijing university”,“China is my hometown”};
这两个定义很相似,但还是有区别的,str是一个指针数组,内含4个指针的数组,在我们的系统中共占用
32字节;而ptr是一个内含4个数组的的数组,每个数组内含n个char类型的值,占用大于32字节。此外,为数组分配内存的使用率较低,ptr中每个元素的大小必须相同,而且必须是能够储存最大的长度字符串的大小。
2. 字符数组的指针求差
char a[10]={“aknksvbas”};
char *p1=a;//指向a[0]元素
char *p2=&a[9];
printf("%d",p2-p1);//两个指针的差值即为中间的元素个数
return 0;

  1. 字符数组的指针比较运算
    两个指针相比较,前提是两个指针都指向相同类型的对象。
    int sump(int *start,int *end);
    int main(void)
    {
    int numble[10]={10,10,10,10,10,10,10,10,10,10};
    int answer;
    answer=sump(numble,numble+sizeof(numble)/4);//此处指针指向的数组元素
    }
    int sump(int * start,int * end)
    {
    int total = 0;
    while(start<end)//此处利用指针的大小比较
    {
    total += *start;
    start++;
    }
    return total;
    }

  2. 字符串函数的讲解
    头文件都是<string.h>
    A.strlen(str)计算数组的长度;

B. strcat用于拼接字符串;事例如下:
int main()
{
char a[]={“aknksvbas”};
char b[]={“sabci”};
printf("%s",strcat(a,b));
return 0;
}
打印结果为:aknksvbassabci

Process exited after 0.1785 seconds with return value 0
请按任意键继续. . .

C.strncat(用于拼接字符串)但是限制了拼接的长度
int main()
{
char a[]={“aknksvbas”};
char b[]={“sabci”};
printf("%s",strncat(a,b,3));
return 0;
}
打印结果为:aknksvbassab
Process exited after 0.1619 seconds with return value 0
请按任意键继续. . .

D.strcmp(str1,str2)比较两个字符串的大小

E.strcnmp(str1,str2,lim)lim指的是限定的字符数范围;
F.strcpy字符串的拷贝,复制。
int main()
{
char a[]={“aknksvbas”};
char b[20];
strcpy(b,a);
printf("%s",b);
return 0;
}
打印结果为:aknksvbas
Process exited after 0.2049 seconds with return value 0
请按任意键继续. . .
若在strcpy对b进行赋值之后,再b=“so long”;是有语法问题的。这儿相当于修改b[]的地址,是不可行的。
若char *str;strcpy(str,“akvbi”);这样是错误的,因为不知道str的位置。
strncpy用法类似于strncat与strcnmp;
5.字符串的排序
#include<stdio.h>
#include<string.h>
#define size 81
#define lim 5
int main()
{
char input[lim][size];
char *str[lim];//存储每一个字符串的首地址
char *p;
int ct=0;
int k;
while(ct<lim&&(scanf("%s",input[ct])!=EOF))
{
str[ct]=input[ct];
ct++;
}
int i,j;
for(i=0;i<=lim-1;i++)
{
for(j=0;j<lim-1;j++)
{
if(strcmp(str[j],str[j+1])>0)
{
p=str[j];
str[j]=str[j+1];
str[j+1]=p;
}
}
}
for(i=0;i<=lim-1;i++)
{
printf("%s\n",str[i]);
}
return 0;
}

其中char input[lim][size];
char *str[lim];//存储每一个字符串的首地址
char p;
int ct=0;
int k;
while(ct<lim&&(scanf("%s",input[ct])!=EOF))
{
str[ct]=input[ct];
ct++;
}
可以换一种写法如下:
char input[size
10];
char str[lim];
char p;
int ct=1,i,j;
gets(input);
str[0]=&input[0];
for(i=0;
(input+i)!=’\0’;i++)
{
if(
(input+i)==’ ‘)
{
*(input+i)=’\0’;
str[ct++]=&input[i+1];
}
}
6.ctype.h系列字符函数和字符串
#include<ctype.h>
A.
if(isalpha(ch))isalpha用于判断是否是字母;
putchar(ch+1);

B.isdigit(n)用于判断是否是数字;

C.atoi()函数用于把字母数字转化成整数,该函数接受一个字符串作为参数,返回相应的整数值(整形)。
特别注意,该函数要求被转换的字符串是按十进制数理解的。
#include <stdlib.h>
#include <stdio.h>
int main()
{
char str[10]=“647236”;
printf("%d",atoi(str));
return 0;
}
打印结果是:647236
Process exited after 4.71 seconds with return value 0
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/88086222
今日推荐