设为首页 加入收藏

TOP

C语言字符串用指针处理字符串
2013-02-19 13:02:51 来源: 作者: 【 】 浏览:687
Tags:语言 字符串 指针 处理

  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 运行成功。

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言结构体对齐的学习 下一篇c/c++中typedef详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: