首页 > 代码库 > 指针的编程艺术(二)

指针的编程艺术(二)

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


指针变量大小为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 = http://www.mamicode.com/strcmp(str1,str2);>