栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

11.字符和字符数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

11.字符和字符数组

11.1 表示字符串和字符串I/O

字符串是以空字符()结尾的char类型数组。本章将讨论字符串的性质、如何声明初始化字符串、如何在程序中输入输出字符串,以及如何操纵字符串。

#include 
#define MSG "I am a symbolic string constant."
#define MAXLENGTH 81
int main(void)
{
    char words[MAXLENGTH] = "I am a string in an array.";
    const char * pt1 = "Something is pointing at me.";
    puts("Here are some strings:");
    puts(MSG);
    puts(words);
    puts(pt1);
    words[8] = 'p';
    puts(words);

    return 0;
}
  • puts():属于’stdio.h’,只显示字符串,而且在自动显示的字符串末尾加上换行符
11.1.1 在程序中定义字符串
  1. 字符串字面量(字符串常量)

    用双引号括起来的内容称为字符串字面量,也叫做字符串常量。双引号中的内容和编译器自动加的字符,都作为字符串存储在内存中。

    用双引号括起来的内容被视为指向该字符位置的指针。

  2. 字符串数组和初始化

    一种方法就是用足够空间的数组存储字符串

    const char m1[40] = "my name is wh";
    
    • 注意,要确保数组元素个数比字符串长度多1(为了容纳空字符),所有未被使用的元素都被自动初始化为0(字符串0而非数字0)

    省略初始化声明中的数组大小,编译器会自动计算数组大小

    const char m2[] = "hellow how are you?";
    
    • 注意,只有在初始化数组时可以这样使用,如果是稍后填充,就必须指定大小。

    使用指针表示创建字符串

    const char *pt1 = "i'm fine thank you";
    
    • 虽然和第一种方式类似,但并不完全相同,下面细说。
  3. 数组和指针

  • 字符串存储在静态存储区,但是程序开始运行时才会为为数组分配空间。此时将字符串拷贝到数组中。注意,此时字符串有两个副本,一个是静态内存的字符串字面量,一个是存储在数组中的字符串。

  • ar1是地址常量,不能更改,pt1是指针变量,可以改变

  • 字符串字面量被视为const数据,所以应该赋值给const定义的指针。

  1. 数组和指针的区别

    1. 数组名是常量,指针名是变量。
    2. 只有指针表示法可以进行递增操作。
    3. 如果打算修改字符串,就不要用指针指向字符串字面量。
  2. 字符串数组

#include 
#define SLEN 40
#define LIM 5
int main(void)
{
    const char *mytalents[LIM] = {
        "Adding numbers swiftly",
        "Multiplying accurately", "Stashing data",
        "Following instructions to the letter",
        "Understanding the C language"
    };
    char yourtalents[LIM][SLEN] = {
        "Walking in a straight line",
        "Sleeping", "Watching television",
        "Mailing letters", "Reading email"
    };

mytalents 是一个存储5个指针的数组,内存只占40字节;而yourtalents是一个存储5个长度为40的字符串的数组,内存占200字节。

  • 如果你要显示一系列字符串,请使用指针数组,因为他的效率高,如果要修改字符串内容,使用字符串数组。
11.2 字符串输入 11.2.1 分配空间

最简单的方法就是,在声明时显式指明数组的大小;

char name[81];

c库提供了scanf(),gets()和fgets()。下面先讨论gets()。

11.2.2 不幸的gets()函数

他读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符。并在末尾添加空字符。

char name[81];
gets(name);

如果字符串过长,导致缓冲区溢出,现已不适用gets()函数。因为这个错误可能由用户触发。所以不在使用。

11.2.3 gets()的替代品
  1. fgets()函数(和fputs())

    1. 第二个参数表明读入字符的最大数量,如果是n,就读入n-1个字符,或者读到遇到的第一个换行符为止。
    2. 读到换行符为存储在字符串中。
    3. 第三个参数表明要读入的文件,如果是从键盘输入的数据,则以stdin作为参数。

    fputs()类似,第二个参数表示要写入的文件,如果是显示器,用stdout作为参数。

    fgets()返回的是第一个参数的地址。

  2. get_s()函数

    1. get_s()函数只从标准输入中读取数据,因此不需要第三个参数。
    2. get_s()函数读到换行符会丢弃它
    3. 读到最大字符没有读到换行符,会返回空指针可能会终止程序。
  3. s_gets()函数

    char * s_gets(char * st, int n)
    {
        char * ret_val;
        int i = 0;
        
        ret_val = fgets(st, n, stdin);
        if (ret_val)
        {
            while (st[i] != 'n' && st[i] != '')
                i++;
            if (st[i] == 'n')
                st[i] = '';
            else // must have words[i] == ''
                while (getchar() != 'n')
                    continue;
        }
        return ret_val;
    }
    
    • s_gets()函数就是从fgets()改进过来的
    • 读到换行符会舍弃换行符
    • 会舍弃缓存区多余的输入
11.2.4 scanf()函数
  • 都从第一个非空白字符作为字符串的开始
  • 以下一个空白字符(空行,空格,制表符或换行符)作为字符串的结束
  • 如果指定了字段宽度,如%10s,那么scanf()将读取10个字符,或读到第一个空白字符停止。
11.3 字符串输出 11.3.1 puts()函数
  • puts()函数会在末尾自动添加一个换行符。
11.3.2 fputs()函数
  • fputs()函数第二个参数指明要写入数据的文件。如果要打印在显示器上,可以定义在stdio.h中的stdout作为该参数。
  • 不会再末尾添加换行符。
11.3.3 printf()函数

没啥好说的

11.4 自定义输入/输出函数
  • 不一定要使用c库中的标准函数,完全可以在getchar和putchar的基础上自定义所需的函数。
11.5 字符串函数

c提供了很多处理字符串的函数,这些都存储在string.h头文件中

(1条消息) 常用的字符串函数详解_会掉发的程序员的博客-CSDN博客_字符串常用函数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980160.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号