C语言字符串用指针处理字符串

 

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

 

 
Microsoft Visual C++ 6.0 运行成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值