第一弹
萌猫导航

8.7C语言字符串指针

作者: 不爱洗头发 来源: 怪哈哈网 日期: 2015-09-28 17:58:33 人气: -

在C语言中,可以通过字符数组存放一个字符串,也可以用字符指针指向一个字符串。

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

  1. #include <stdio.h>
  2. int main(){
  3. char string[] = "I love China!";
  4. printf("%s\n", string);

  5. return 0;
  6. }

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

【示例】用字符串指针指向一个字符串。

  1. #include <stdio.h>
  2. int main(){
  3. char *string = "I love China!";
  4. printf("%s\n", string);

  5. return 0;
  6. }

对指向字符变量的指针变量应赋予该字符变量的地址。如:

char c, *p=&c;

表示p是一个指向字符变量c的指针变量。而:

char *s="C Language";

则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。

上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译器把它装入一块连续的内存单元)。程序中的:

char *string = "I love China!";

等效于:

char *string;
string = "I love China!";


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

  1. #include <stdio.h>
  2. int main(){
  3. char *ps = "This is a good tutorial!";
  4. int n=10;
  5. ps=ps+n;
  6. printf("%s\n", ps);
  7. return 0;
  8. }

运行结果为:
good tutorial!

在程序中对ps初始化时,把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符'b',因此输出为 "good tutorial!"。

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

  1. #include <stdio.h>
  2. int main(){
  3. char str[20], *ps;
  4. int i;
  5. printf("Input a string: ");
  6. ps = str;
  7. scanf("%s", ps);
  8. for(i=0; ps[i]!='\0'; i++){
  9. if(ps[i]=='k'){
  10. printf("There is a 'k' in the string!\n");
  11. break;
  12. }
  13. }
  14. if(ps[i]=='\0') printf("There is no 'k' in the string\n");

  15. return 0;
  16. }

运行结果:
Input a string: thank you
There is a 'k' in the string!

【示例】不使用 strcpy 函数实现字符串的复制。

  1. #include <stdio.h>

  2. void cpystr(char *pss, char *pds){
  3. while((*pds=*pss)!='\0'){
  4. pds++;
  5. pss++;
  6. }
  7. }

  8. int main(){
  9. char *pa = "Apple, Samsung, Xiaomi, Smartisan", b[100], *pb;
  10. pb=b;
  11. cpystr(pa, pb);
  12. printf("string a=%s\nstring b=%s\n",pa, pb);

  13. return 0;
  14. }

运行结果:
string a=Apple, Samsung, Xiaomi, Smartisan
string b=Apple, Samsung, Xiaomi, Smartisan

函数 cprstr 的形参为两个字符指针变量,pss 指向源字符串,pds 指向目标字符串。注意表达式(*pds=*pss)!=`\0'的用法。

本例中程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\0',若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。

在主函数中,以指针变量pa、pb为实参,分别取得确定值后调用cprstr 函数。由于采用的指针变量pa和pss、pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:

  1. void cprstr(char *pss,char*pds){
  2. while( (*pds++=*pss++) != '\0' );
  3. }

即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现 `\0' 的ASCII码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去!='\0'这一判断部分,而写为以下形式:

  1. void cprstr(char *pss,char*pds){
  2. while(*pds++ = *pss++);
  3. }

表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非 0 则循环,否则结束循环。这样使程序更加简洁。


转载请注明文章来源(欢迎分享): http://www.guaihaha.com/c/5621.html

相关内容

怪哈哈动漫图库
关于怪哈哈
怪哈哈是一个集搞笑,美女,动漫,游戏,技术等为核心的综合性网站!
联系我们
商务洽谈、广告合作、友情链接、侵权举报,这些都可以联系我们哦!
关于我们 - 联系我们 - 广告服务 - 免责申明   
本站文字和图片均为严格审查筛选收藏,均收集整理于互联网,其著作权归原作者所有,如果有侵犯您权利的照片,请来信告知,我们将及时撤销相应文字和图片.
Copyright @2014-2020 怪哈哈网 All Rights Reserved.
【谢谢大家一直支持贵站】