• C语言中的字符串


    字符串

    1. 字符串

    用双引号引起来的多个字符。

    在C语言中字符串是用’’结束的。即每个字符串的最后一个字符是’’,但是结束符不显示,仅仅标志该字符串到这儿就结束了。

    二、声明字符串

    char *str = “Hello world! ”;

    系统在常量区分配一块存储空间,存储形式是:

    pastedGraphic.png

    把该字符串在常量区的地址保存到指针变量str中。

    可以以%s的形式在屏幕上打印输出字符串,如:

    printf(“%s”, str );

    需要注意的是:1) str是一个指针变量,该变量在栈结构中,而实际的字符串在内存的常量区。2)该字符串在内存常量区中占用14个字节,因为有一个结束符’’。3)在printf()函数中以%s打印输出时,从指针变量str标识的地址开始打印,直到遇到’’。4)字符串是一个常量,不能被修改,即 *str = ‘W’; 通过指针变量给这个字符串的第一个字符重新赋值是不正确的。5)声明字符串会返回该字符串在常量区的地址,所以:printf( “%c ”, ”hello world! ”);这条语句在执行时,会打印输出字母h。因为取操作后就是这个地址所指向的字符。

    三、字符串的常用操作

    1. 字符串的修改。

    因为字符串在常量区,不能被修改,如果需要修改字符串,需要把字符串复制到栈结构中的数组中,再修改:

    char  str2[] = “hello world ”;

    字符数组可以直接按以上形式直接初始化。再次提醒大家,sizeof(str2) 应该返回的值是14,因为需要包括结束标志’’.

    2.字符串的读取与打印

    先定义一个足够大的数组,然后通过scanf()函数以%s的格式输入,如:

    char  buff[64]; //定义存储字符串的数组

    scanf( “%s”, buff ); //读取

    printf(“%s ”, buff ); //打印

    这儿需要说明的是scanf("%s")这种格式在接收字符串时,它不能接收空格、tab键等空白字符,如果需要接收这些空白字符,需要使用gets(str)函数, 用这个函数会弹出不安全警告,因为输入的内容可能会超过数组的长度

    需要注意:

    char  * str;

    scanf(" %s" , str );  //??????是否可以读一个字符串,str只是定义了没有初始化,指向哪儿不确定,这就是野指针

    3. 通过指针变量保存字符串

    char *p1 = "abcdef";

    char *p2 = "abcdef";

    "abcdef"字符串保存在常量区中,不能被修改,即

    *p1 = 'h'; 会出错; 另外,p1变量中保存的地址和p2变量中保存的地址是相同的。都是"abcdef"字符串的首地址。

    练习:

    char * demo(){

    char names[] = "zhangsan";

    return names;

    }

    通过这种方式返回在子函数中定义的局部变量数组names,实际返回的是空。应该把char names[]数组改为指针的形式:

    char *names = "zhangsan"; //保存在常量区

    四、 字符串的相关函数

    字符串的相关函数的声明在头文件string.h中

    1. 字符串的复制

    strcpy ( char * dest,  const char *source);

    dest是一个数组的首地址, source是一个字符串常量的首地址,把source复制到数组dest中,包括最后的结束标志也要复制,该函数返回dest.

    字符串在复制时,实际上是

    int i = 0;

    for (  ;  source[i] != '';  i++ ){

    dest[i] = source[i];

    }

    dest[i]='';

    或写为:

    char * x = dest;

    while( *dest++ = *sourse++) ;

    return x;

    2. 字符串的长度

    size_t strlen ( const char *)

    计算字符串的有效长度,不包括结束标志

    size_t是 unsigned long的别名

    3. 字符串转数字

    int  atoi ( const char *s); //该函数在stdlib.h头文件中

    将数字字符串转换为数字,如将“123”转换为123.

    4.字符串连接

    char * strcat( char * s1, const chsr *s2)

    将s2字符串拼接到s1字符串后面

    练习:输入三个字符串,并将三个字符串拼接到一起,生成一个新的字符串;

    5. 查找子串

    char * strstr( const char *s1, const char *s2)

    在s1中查找s2,返回首字母的地址,如果找不到,返回NULL。

    练习:在一个字符串“adbcdeedededededead",中查找子串“ded"出现的次数。

    6. 字符串比较

    char * strcmp( const char * s1, const char * s2)

    依次比较两个两个字符串的每个字符,返回首个不相等字符的Ascii码的差值。如果s1比s2大,返回正数,否则返回负数,相等返回0

    7.字符串分隔函数

    char*  strtok( const char *s1, const str *s2);

    被分隔的字符串s1,可能在数组中,不是是常量字符串。s2是分隔符

    char str[] = "hello world You are good";

    char *p = str;

    while( 1 ){

    p = strtok(p, " " );   // p=strtok(p, " ,.!" ); 

    if (p == NULL)

    break;

    printf("%s ", p );

    p=NULL;

    }

    作业:

    1.自己编写一个函数,实现两个字符串的连接

    2.实现字符串的比较函数

    3.实现字符串查找函数

    4. 将字符串中的单词逆序输出,”you are a man",输出后“man a are you"。

    5.输入一行字符串,清除该行字符串中的标点符号。

    1. char * substr (char * dst, char *src, int start, int end)

    从字符串src中取出从start到end的子串,通过dst和返回值返回子串指针,请实现。

    2. char * remove( char *src, int start, int len)

    从src的start处删除长度为len的字串,返回新串指针,请实现。

    3. 输出 “abcdcabcdcefcdcdcg” 中 “cdc”出现的次数

    cdccdc算作出现两次

    cdcdc算作出现一次

  • 相关阅读:
    SharePoint母板页更改
    SharePoint的一些基本操作
    百度地图
    内存管理
    根据文字的个数,label自动适应高度
    navgationBar
    接收服务器上的图片,可以用webview或者 imageview
    iOS 自带的解析json的类。
    改变uilable uibutton等的字体颜色、大小。
    Nsstring和NSdata的编码转换
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5281283.html
Copyright © 2020-2023  润新知