如果要挖井,就要挖到水出为止 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

9.C语言字符串指针

十. C语言指针 memory 发布于April 21, 2014 标签: C语言

C语言中,可以用两种方法访问一个字符串。

用字符数组存放一个字符串,然后输出该字符串。

【例10-24】

main(){
    char string[]=”I love China!”;
    printf("%s\n",string);
}

说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。

用字符串指针指向一个字符串。

【例10-25】

main(){
    char *string=”I love China!”;
    printf("%s\n",string);
}

字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如:
    char c,*p=&c;
表示p是一个指向字符变量c的指针变量。而:
    char *s="C Language";
则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。

上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。程序中的:
    char *ps="C Language";
等效于:
    char *ps;
    ps="C Language";

【例10-26】输出字符串中n个字符后的所有字符。

main(){
    char *ps="this is a book";
    int n=10;
    ps=ps+n;
    printf("%s\n",ps);
}

运行结果为:
    book
在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。

【例10-27】在输入的字符串中查找有无‘k’字符。

main(){
    char st[20],*ps;
    int i;
    printf("input a string:\n");
    ps=st;
    scanf("%s",ps);
    for(i=0;ps[i]!='\0';i++)
    if(ps[i]=='k'){
        printf("there is a 'k' in the string\n");
        break;
    }
    if(ps[i]=='\0') printf("There is no 'k' in the string\n");
}

【例10-28】本例是将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量PF代替了格式串。 这也是程序中常用的方法。

main(){
    static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    char *PF;
    PF="%d,%d,%d,%d,%d\n";
    printf(PF,a,*a,a[0],&a[0],&a[0][0]);
    printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
    printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
    printf("%d,%d\n",a[1]+1,*(a+1)+1);
    printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
}

【例10.29】本例是把字符串指针作为函数参数的使用。要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。注意表达式:(*pds=*pss)!=`\0'的用法。

cpystr(char *pss,char *pds){
    while((*pds=*pss)!='\0'){
        pds++;
        pss++;
    }
}
main(){
    char *pa="CHINA",b[10],*pb;
    pb=b;
    cpystr(pa,pb);
    printf("string a=%s\nstring b=%s\n",pa,pb);
}

在本例中,程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\0',若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。在主函数中,以指针变量pa,pb为实参,分别取得确定值后调用cprstr函数。由于采用的指针变量pa和pss,pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:
    cprstr(char *pss,char*pds)
    {while ((*pds++=*pss++)!=`\0');}
即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现`\0'的ASCⅡ码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去“!=`\0'”这一判断部分,而写为以下形式:
    cprstr (char *pss,char *pds)
    {while (*pdss++=*pss++);}
表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非0则循环,否则结束循环。这样使程序更加简洁。

【例10-30】简化后的程序如下所示。

cpystr(char *pss,char *pds){
    while(*pds++=*pss++);
}
main(){
    char *pa="CHINA",b[10],*pb;
    pb=b;
    cpystr(pa,pb);
    printf("string a=%s\nstring b=%s\n",pa,pb);
}

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1505篇
  • 用户评论:712条
  • 开博至今:4035天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • 7ee5bec831b4e528c3a1d46ab8dd40c9: pid是传入当前获取的id值.在后台查询当前这个id值下的下级分类.
  • Uncaught ReferenceError: form is not defined: Uncaught ReferenceError: form is...
  • 春熙路: 8年的老博主了、致敬
  • hello: hello world
  • memory: 好的,感谢您的反馈。翻译完了也没有校验。。。 检查了一下,med...
  • jiangnvshi: 不知道你还记不记得之前你翻译的medoo文档:http://me...
  • 态度xiaomi: 不错不错。
  • memory: 回头我写个php的demo.
  • zjj: 请问有没有具体pid使用的方法呢?
  • 潇湘居士: 恩,如果是在局域网内部进行系统迁移,我们对比过 SSH 的压缩和...
  • memory: 文中的方案还是比较局限,个人认为还是适合主机迁移的时候比较好使。...
  • 潇湘居士: 使用 axel 或者 aria2 开启多线程下载,同样能达到相同...
  • 八角网赚站: 竟然还有这种操作
  • memory: 以前还有站点统计或百度统计撒的,这两产品到了今年已经开始不争气啦...
  • 夏日博客: 原来 Nginx 还有可以这样分析统计。
  • tomxuetao: 能个实例吗?
  • memory: 哈哈哈。。。话说也没毛病。