01./*
02. 用指针处理串,用串作为函数的参数
03. 编写这个交互式小程序,它读入用户输入的一行字符作为一个串,然后程序创建新串并且打印它
04. 程序思路:
05. 1.先在主函数申请line字符数,在主函数调用read_in()函数,保存用户输入的数据
06. 2.在主函数调用change()函数,进行串赋值
07. 3.在主函数打印新串
08.*/
09.# include <stdio.h>
10.# include <stdlib.h>
11.# include <string.h>
12.
13.# define MAXLINE 100
14.
15.void read_in(char *);
16.char * change(const char s[]);
17.
18.int main()
19.{
20. char line[MAXLINE];//*change(char *); 函数内部声明函数,这种方法不推荐
21.
22. printf("\nWhat is you favorite line ");
23. //通过read_in把字符放入line,把line作为参数传给change(),该函数返回一个char指针,以串格式的printf()显示返回的值
24. read_in(line);
25. //change(),该函数返回一个char指针,以串格式的printf()显示返回的值
26. printf("\n%s\n\n%s\n\n","Here it is after being changed :",change(line));
27.
28. return 0;
29.}
30.//读入用户输入的程序,
31./*
32. 从输入流中得到连续字符,并一个接一个地把它们放进以基地址s开始的数组中,当接收到换行符的时候,就终止循环,并
33.把空字符放进数组中作为串结束的标志,这个函数没有分配空间,在main()中,用line的声明分配空间。
34. 把line作为传输传递给read_in()时,传递的是数组的基地址拷贝,参数s接收这个值,数组元素本身不被拷贝,但可在
35.read_in()中通过基地址访问它们
36.*/
37.void read_in(char s[])
38.{
39. int InputChar,i = 0;
40. while((InputChar = getchar()) != EOF && InputChar != '\n')
41. {
42. s[i++] = InputChar;
43. }
44. s[i] = '\0';
45.}
46.
47.// 这个函数接收一个串进行复制,同时把e变成E,并用换行和跳格符代替每个空格
48.//由于s是参数,所以原来的 char * change(const char *s)写成下面用的
49.char * change(const char s[])////此函数返回 char *类型
50.{
51. static char new_string[MAXLINE];
52. char *p = new_string;
53. //*和++都是一元运算符,而且都是自右向左,所以*p++ = '\t' 等价于 *p = '\t';p++;
54. //*p++ 等价于*(p++) (*p)++是增加的值的加1
55. *p = '\t'; //*p++ = '\t';
56. ++p;
57. //赋值是求值得一部分,这使得把一个跳格符赋值给p指向的位置,因为p指向new_string的基地址,所以把跳格符赋给new_string[0]
58. //对p增量后,p指向new_string
59. //测试s所指位置的值是否是串结束标志,如果不是就指向for循环体,并且对s进行增量,
60. //对指向char的指针增量的作用是是指针指向数组的下一个字符
61. for(; *s != '\0';++s)
62. {
63. if(*s == 'e')
64. {
65. //*p++ = 'E';
66. *p = 'E';
67. ++p;
68. }
69. //测试是否指向空格,若是,把换行符赋给p指向的对象,并对p增量,再把跳格符赋值给p所指向的对象,并对p再次增量
70. else if (*s == ' ')
71. {
72. //*p++ = '\n';
73. *p = '\n';
74. ++p;
75.
76. //*p++ = '\t';
77. *p = '\t';
78. ++p;
79. }
80. else
81. {
82. //*p++ = *s;
83. *p = *s;
84. ++p;
85. }
86. }
87. //把串的结束标志赋给p指向的对象
88. *p = '\0';
89. return new_string;
90.}
91.
92./*
93. 若new_string 的存储类型是自动而不是静态的,分配给它的内存在函数退出时将不被保存,很多系统中这是很严重的问题
94. 一种可能是内存被重写,并且main()中的printf()工作不正常
95.
96. 2011年10月20日18:06:05 于图书馆6楼
97.
98.*/
Microsoft Visual C++(www.cppentry.com) 6.0 运行成功。
