【例7.18】输出字符串中n个字符后的所有字符。
程序内容如下:
1 #include<stdio.h>
2 void main()
3 {
4 char*p="this is a book";
5 int n=10;
6 p=p+n;
7 printf("%s\n",p);
8 }
程序结果如图7.24所示:
图7.24 例7.18程序结果图
【例题中关键问题说明】
在程序中对p初始化时,即把字符串首地址赋予p,当“p=p+10”之后,p指向字符“b”,因此输出为“book”。
用指针处理字符串应注意的几个问题:
(1)无论是通过初始化还是赋值方式使指针指向某个字符串时,指针中存放的只是字符串的首地址,不要误认为指针中存放的就是该字符串。
这里需要注意:定义的指针变量只能指向一个字符变量或其他字符型数据,不能同时指向多个字符数据。
(2)字符型指针处理字符串时,由于每个字符串都占用各自的存储区,即使两个字符串完全相同,它们的地址也不一样。故当一个指针多次赋值后,该指针将指向最新赋值的字符串,而原先存放的字符串就不能用该指针变量继续访问了。
例如:
char*str="Pascal Language";
printf("%s\n",str);
str="C Language";
指针str起先指向“Pascal Language”,其后又指向“C Language”,“Pascal Language”并没有被“C Language”替换,而是两个字符串各自占用自己的存储单元,具有不同的起始地址。指针指向了“C Language”就不再指向“Pascal Language”,此时若没有其他指针指向“Pascal Language”的话,“Pascal Language”就不可访问了。
(3)单独使用指针只能处理字符串常量,不宜企图通过输入的方式处理任意字符串。请看下面的程序:
#include<stdio.h>
int main()
{
char*s;
gets(s);
printf("%s\n",s);(www.xing528.com)
return 0;
}
在程序规模很小,内存空间空余很大的时候,程序也能正常运行,但是这种方法是很不可靠的。编译系统只安排了指针变量s的地址,s中却没有确定的值,即没有确切的指向。当用输入函数scanf()或gets()输入时,没有确定的地址来存放该字符串,而将该字符串安排在常量存储区中并取其首地址作为s的值。随着程序规模的扩大,无“指向”指针的增加,当常量存储区不敷使用的时候,就可能占用其他变量甚至程序代码已经使用的存储空间,轻者造成混乱,重者使程序瘫痪。
【例7.19】编写程序将两个字符串连接在一起。
程序内容如下:
1 #include<stdio.h>
2 void main()
3 {
4 char s1[40],s2[20],*p1,*p2;
5 p1=s1;
6 p2=s2;
7 printf("请输入字符串s1:");
8 gets(s1);
9 printf("请输入字符串s2:");
10 gets(s2);
11 while(*p1)
12 p1++;
13 while(*p1++=*p2++);
14 printf("连接后结果:%s\n",s1);
15 }
程序结果如图7.25所示:
图7.25 例7.19程序结果图
【例题中关键问题说明】
(1)第4行同时定义两个数组s1、s2和两个指针p1、p2。
(2)第5、6行使两个指针p1和p2分别指向两个字符数组的首地址。
(3)利用循环依次使p1自增,直到*p1是字符串结束符为止。此时,指针p1指向了字符串1的末尾。从该位置起,利用循环依次将*p2复制到*p1,直到*p2的内容为′\0′(字符串结束符)为止。字符串2连接到字符串1后,要保证连接后的字符串1一定有结束符。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。