指针的编程艺术(二)

指针的编程艺术(二)之指针与字符串


指针变量大小为4个字节,看一个例子:

#include<stdio.h>

int main()
{
    double i = 10, j = 100;

    double * p = &i;
    double * q = &j;

    printf("%p\n",p);
    printf("%p\n",q);

    return 0;

}



发现两个数据的地址距离是8,正好是double类型数据的大小,(地址的差距为指针变量所指向数据类型的大小)但是它不是指针类型变量的大小,其实看这个地址也可以发现它由8位十六进制数据组成,正好需要4个字节大小,没错 这就是指针变量的大小。


进入正题,指针与字符串:

    char * p = "Apple iPod";
p指向第一个字符‘A’的地址,也就是该字符串的首地址。

A

P

P

L

E

 

I

P

O

D

\0

注意:字符串的末尾都有一个空字符作为字符串的结束标志,如果缺少它,将会出现错误。

遍历该字符串中的字符:

#include<stdio.h>
#include<conio.h>

int main()
{
    char * p = "Apple iPod";

    printf("字符串为:");

    for(int i=0; *p!='\0'; i++)
    {
        printf("%c",*p);
        p++;
    }    
    printf("\n");
    printf("%s",p);//直接将字符串输出
    return 0;
}

下面一个缺少结束符的例子:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char * str1 = "Apple iPod";
    char str2[10] = "Apple iPod";
    printf("%s",str1);
    printf("%s",str2);
    return 0;
}
有的编译器在编译的时候会识别出来str2这个错误 ,但是有的识别不出来,输出的结果是字符串后面多了好多字符,类似于“烫”。

常用的字符串库函数

通常谈到字符串的操作,不外乎计算字符串长度(string length)、字符串拷贝(string copy)、字符串连接(string concatenate)、字符串比较(string compare)。

下面给出库函数的使用和自己编写代码模仿库函数。


计算字符串的长度:strlen(str)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int stringlength(char * p);

int main()
{
    /*使用库函数*/
    char * str = "Apple iPod";
    printf("长度为:%d\n",strlen(str));
    /*自己编写*/

    int length = 0;
    length = stringlength(str);
    printf("长度为:%d\n",length);
    return 0;

}

int stringlength(char * p)
{
    int s = 0;
    while(*p!='\0')//直到找到结束符为止
    {
        s++;
        p++;
    }
    return s;
}

字符串的拷贝:strcpy(str1,str2);作用:把str2中的字符逐一复制到str1中。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void stringcopy(char *p, char *q);

int main()
{
    char *str1 = "apple";
    char str2[10] = "";
    strcpy(str2,str1);
    printf("%s\n",str2);

    stringcopy(str2,str1);
    printf("%s\n",str2);

    return 0;
}

void stringcopy(char *p, char *q)
{
    while((*p=*q)!='\0')
    {
        p++;
        q++;
    }
}

如果将
char str2[10] = "";
改为 char *str2将会出现错误,引文str2没有指向任何内存空间,解决方法是给它分配内存。

t = (char *)malloc(10 * sizeof(char));

字符串连接:strcat(str1,str2),作用是将str2字符串连接到str1的尾端。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void stringcat(char *p, char *q);

int main()
{
    char * str1 = "apple";
    char * str2 = "orange";
    char str3[50] = "i want to bay a";

    strcat(str3,str1);
    printf("%s\n",str3);


    stringcat(str3,str2);
    printf("%s\n",str3);

    return 0;
}

void stringcat(char *p, char *q)
{
    while(*p!='\0')
    {
        p++;
    }
    while((*p=*q)!='\0')
    {
        p++;
        q++;
    }
}
千万不要这样:
strcat(str1,str2);//原因还是没有分配内存空间

字符串比较:strcmp(str1,str2),作用是将这两个字符串是否相等。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int stringcompare(char *p, char *q);

int main()
{
    char *str1 = "abczx";
    char *str2 = "abczc";
    int value = strcmp(str1,str2);
    if(value==0)
    {
        printf("str1和str2相等\n");
    }
    else if(value > 0)
    {
        printf("str1大于str2\n");
    }
    else
    {
        printf("str1小于str2\n");
    }

    value = stringcompare(str1,str2);
    if(value==0)
    {
        printf("str1和str2相等\n");
    }
    else if(value > 0)
    {
        printf("str1大于str2\n");
    }
    else
    {
        printf("str1小于str2\n");
    }
    return 0;
}

int stringcompare(char *p, char *q)
{
    for(; *p==*q; p++,q++)
        if(*p=='\0')
            return 0;
    return *p-*q;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值