C语言零碎知识点之字符串数组

这篇具有很好参考价值的文章主要介绍了C语言零碎知识点之字符串数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

字符串数组的表示形式

在C语言中字符串数组有两种表示方法:

  • 第一种,二维字符数组

可以利用二维字符数组来表示字符串,格式是:char strs[row][col];。例如:

char strs[4][6] = {"hello", "world", "c", "java"};// char 类型的二维数组

// 注意,也不支持先声明再赋值。即下面的赋值方式是错误的
char strs[4][6];
strs = {"hello", "world", "c", "java"};

其中的 row 表示二维数组中的行,表示有几个字符串;而 col 表示二维数组中的列,表示能存放字符串的最大长度。

  • 第二种,字符指针数组

可以用一维的字符指针数组来保存字符串,格式是:char* strs[len];。例如:

char* strs[4] = {"hello", "world", "c", "java"};// char* 类型的一维数组

注意,也不支持先声明再赋值。即下面的赋值方式是错误的
char* strs[4];
strs = {"hello", "world", "c", "java"};

该一维数组中的每一个元素都是一个 char 类型的地址:

  • 第一个指针 strs[0] 指向第一个字符串中的第一个字符。即 *strs[0] 等于 'h'
  • 第二个指针 strs[1] 指向第二个字符串中的第一个字符。即 *strs[1] 等于 'w'

每个 strs[i] 都表示一个字符串,指针都指向对应字符串的第一个字符。

因此实际上这个一维数组并不存放真正的字符串,而只是存放字符串的地址。

从键盘输入字符串数组

有时候我们需要批量从键盘输入字符串,无论是二维字符数组还是一维字符指针数组,都可以通过循环输入字符串的方式来给字符串数组赋值,而从键盘输入字符串的方式有 scanfgets 两种,根据情况选择即可:

  • 二维字符数组表示的字符串数组的批量赋值
#include <stdio.h>

int main() {
    // 声明二维字符数组,注意指定字符串个数和字符串最大长度
    char strs[4][10];
    // 通过循环批量输入字符串并赋值给字符串数组
    for (int i = 0; i < 4; i++) {
        scanf("%s", strs[i]);
        // 或者使用 gets() 函数
        // gets(strs[i]);
    }
    // 打印结果
    for (int i = 0; i < 4; i++) {
        printf("%s\n", strs[i]);
    }
}
  • 一维字符指针数组表示的字符串数组的批量赋值
#include <stdio.h>
#include <malloc.h>

int main() {
    // 声明一维字符指针数组
    char *strs[4];
    // 通过循环批量输入字符串并赋值给字符串数组
    for (int i = 0; i < 4; i++) {
        // 声明字符串,并为其分配内存空间
        char *str = (char *) malloc(sizeof(char) * 10);
        gets(str);// 使用 gets 函数从键盘读取输入
        strs[i] = str;// 赋值
        // 或者使用 scanf() 函数
        // scanf("%s", str);
        // 注意,我们不能直接使用 gets(strs[i]); 或者 scanf("%s", strs[i]); 来进行赋值
    }
    // 打印结果
    for (int i = 0; i < 4; i++) {
        printf("%s\n", strs[i]);
    }
}

输出字符串数组

输出字符串数组,实际上就是循环数组输出每个字符串,而输出字符串的函数有 printfputs

无论是二维字符数组还是一维字符指针数组,都可以通过循环遍历输出字符串数组中的所有字符串:

#include <stdio.h>

int main() {
    // 二维字符数组声明的字符串数组
    char strs[4][10] = {"tom", "jack", "rose", "lily"};
    for (int i = 0; i < 4; i++) {
        printf("%s\t", strs[i]);
    }
    printf("\n");

    // 一维指针数组声明的字符串数组
    char *strs2[4] = {"java", "javascript", "python", "c"};
    for (int i = 0; i < 4; i++) {
        puts(strs2[i]);
    }
}

访问字符串数组中的字符串

如果要访问二维字符数组声明的字符串数组中的字符串,可以通过两种方式:

  • 下标,例如:strs[i]
  • 数组名加下标,例如:*(strs + i)
#include <stdio.h>

int main() {
    char strs[4][10] = {"tom", "jack", "rose", "lily"};
    // 通过数组下标来访问,例如:strs[i],其中 i 是数组下标
    printf("%s\n", strs[1]);
    // 通过数组名加下标的方式来访问,例如:*(strs + i),其中 strs 是数组名,而 i 是数组下标
    printf("%s\n", *(strs + 2));
}

如果要访问一维字符指针数组声明的字符串数组中的字符串,也可以通过上面的两种方式来访问:

#include <stdio.h>

int main() {
    char *strs[4] = {"tom", "jack", "rose", "lily"};
    // 通过数组下标来访问,例如:strs[i],其中 i 是数组下标
    printf("%s\n", strs[1]);
    // 通过数组名加下标的方式来访问,例如:*(strs + i),其中 strs 是数组名,而 i 是数组下标
    printf("%s\n", *(strs + 2));
}

即无论是二维字符数组声明的字符串数组还是一维字符指针数组声明的字符串数组,都可以通过下标或者数组名加下标的方式访问数组中的字符串。

修改字符串数组中的字符串

只有二维字符数组声明的字符串数组才可以通过 strcpy 或者 sprintf 函数进行赋值,而一维字符指针数组声明的字符串数组不允许修改数组中的字符串:

#include <stdio.h>
#include <string.h>

int main() {
    // 1.二维字符数组声明的字符串数组
    char strs[4][10] = {"tom", "jack", "rose", "lily"};
    // 1.1 使用 strcpy 函数进行赋值
    strcpy(strs[1], "java");
    // 1.2 使用 sprintf 函数进行赋值
    sprintf(strs[2], "tomcat");
    // 输出字符串,查看是否修改完成
    for (int i = 0; i < 4; i++) {
        printf("%s\t", strs[i]);
    }

    // 2.一维字符指针数组声明的字符串数组,无法对字符串进行修改
    char *strs2[4] = {"java", "javascript", "c", "c++"};
    // 2.1 使用 strcpy 函数进行赋值,错误的示范
    // strcpy(strs2[1], "JAVASCRIPT");
    // 2.2 使用 sprintf 函数进行赋值,错误的示范
    // sprintf(strs2[2], "C");

    // 下面是错误的示例:
    // 通过数组下标来修改,这是错误的
    // strs[1]="张三";
    // 通过数组名加下标的方式来修改,这也是错误的
    // *(strs+2)="李四";
}

访问字符串数组中的字符串的字符

如果是二维字符数组声明的字符串数组,可以通过如下两种方式来访问(其中 i 和 j 都是指数组的下标,一个是横坐标,一个是纵坐标,都从 0 开始):

  • 下标,格式是:字符串数组名[i][j]。例如,strs[0][1]
  • 数组名加下标,格式是:*(*(字符串数组名 + i) + j)。例如,*(*(strs + 1) + 2)
#include <stdio.h>

int main() {
    // 1.二维字符数组声明的字符串数组
    char strs[4][10] = {"tom", "jack", "rose", "lily"};
    // 1.1通过数组下标访问字符串数组中字符串中的字符
    char c;
    c = strs[1][1];
    printf("%c\n", c);// 'a'
    // 1.2通过数组名加下标的方式访问
    c = *(*(strs + 1) + 2);
    printf("%c\n", c);// 'c'
}

如果是一维指针数组声明的字符串数组,也可以通过上面两种方式来访问:

#include <stdio.h>

int main() {
    // 2.一维指针数组声明的字符串数组
    char *strs[4] = {"tom", "jack", "rose", "lily"};
    // 2.1通过数组下标访问字符串数组中字符串中的字符
    char c;
    c = strs[1][1];
    printf("%c\n", c);// 'a'
    // 2.2通过数组名加下标的方式访问
    c = *(*(strs + 1) + 2);
    printf("%c\n", c);// 'c'
}

修改字符串数组中的字符串的字符

如果是二维字符数组声明的字符串数组,可以通过如下两种方式来修改字符(其中 i 和 j 都是指数组的下标,一个是横坐标,一个是纵坐标,都从 0 开始):

  • 下标,格式是:字符串数组名[i][j]='新字符'。例如,strs[0][1]='X'
  • 数组名加下标,格式是:*(*(字符串数组名 + i) + j)='新字符'。例如,*(*(strs + 1) + 2)='X'
#include <stdio.h>

int main() {
    // 1.二维字符数组声明的字符串数组
    char strs[4][10] = {"tom", "jack", "rose", "lily"};
    // 1.1通过数组下标访问字符串数组中字符串中的修改
    strs[1][1] = 'X';
    printf("%c\n", strs[1][1]);// 'X'
    // 1.2通过数组名加下标的方式修改
    *(*(strs + 1) + 2) = 'Y';
    printf("%c\n", *(*(strs + 1) + 2));// 'Y'

    // 打印字符串,查看是否修改成功
    for (int i = 0; i < 4; i++) {
        puts(strs[i]);
    }
}

但是对于通过一维指针数组声明的字符串数组,里面的字符串是无法修改的,而字符串里面的字符更不能修改。

#include <stdio.h>

int main() {
    // 2.一维字符指针数组声明的字符串数组
    char *strs[4] = {"tom", "jack", "rose", "lily"};
    // 2.1通过数组下标访问字符串数组中字符串中的修改
    // strs[1][1] = 'X';// 错误的写法
    // 2.2通过数组名加下标的方式修改
    // *(*(strs + 1) + 2) = 'Y';// 错误的写法
}

遍历字符串数组中的所有字符串

即遍历字符串数组,无论是二维字符数组声明的字符串数组还是一维字符指针声明的字符串数组,都可以通过 for 循环等循环语句来遍历数组,然后通过下标(例如,strs[i])或者数组名加下标(例如,*(strs + i))的访问字符串:文章来源地址https://www.toymoban.com/news/detail-802301.html

#include <stdio.h>

int main() {
    // 1.二维字符数组声明的字符串数组
    char strs[4][10] = {"java", "javascript", "c", "c++"};
    // 1.1通过 for 循环
    for (int i = 0; i < 4; i++) {
        printf("%s\t", strs[i]);
    }
    printf("\n");
    // 1.2通过 while 循环
    int i = 0;
    while (i < 4) {
        printf("%s\t", *(strs + i));
        i++;
    }
    printf("\n");

    // 2.一维字符指针数组声明的字符串数组
    char *strs2[4] = {"tom", "jack", "rose", "lily"};
    // 2.1通过 for 循环
    for (i = 0; i < 4; i++) {
        printf("%s\t", strs2[i]);
    }
    printf("\n");
    // 2.2通过 while 循环
    i = 0;
    while (i < 4) {
        printf("%s\t", *(strs2 + i));
        i++;
    }
}

到了这里,关于C语言零碎知识点之字符串数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络层中一些零碎且易忘的知识点

    异构网络:指传输介质、数据编码方式、链路控制协议以及数据单元格式和转发机制不同,异构即物理层和数据链路层均不同 虚电路:网络层可以向传输层提供两种类型的服务,面向连接的服务称为虚电路服务,而无连接的服务称为数据报服务。虚电路的想法是避免为发送的

    2024年02月15日
    浏览(42)
  • 数据结构中一些零碎且易忘的知识点

    第一章 绪论 数据结构包含三个方面的内容: 数据的逻辑结构:描述数据之间逻辑关系的、与数据的存储无关的数学模型。相同的逻辑结构可使用不同的存储结构存储,如线性表既可顺序存储,也可链式存储 线性结构:一个线性表是n个具有相同特性的数据元素的有限序列 一

    2024年02月14日
    浏览(41)
  • 数据链路层中一些零碎且易忘的知识点

    差错控制 差错的种类: 位错(比特错):0变1、1变0(这类差错是本节所探讨的差错) 帧错:帧丢失、帧重复、帧失序(这类差错只在提供可靠传输的数据链路层中才进行修复) 要记的编码(数据链路层可使用只检测差错的编码,也可使用纠错编码) 检错编码: 奇偶校验码

    2024年02月15日
    浏览(39)
  • 【webpack】一些零碎的知识点记录:eslint配置、source-map配置、devServer配置

    有些知识点不知道咋归类,就先暂时放在同一个文章里了。这里只记录配置方式,配置的东西是什么就不过多解释了,因为一般需要配置这些东西的也都了解是什么了。 一般在用cli创建vue工程或者cra创建react工程的时候,会默认帮你安装,webpack会自动帮你配置好,我也比较推

    2024年02月13日
    浏览(44)
  • C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识

    0. C语言的内存分配知识 分配内存空间有两种方式:静态内存分配和动态内存分配 0.1 静态内存分配 指的是在编译时确定数组等数据类型的大小,然后由计算机分配好,通常是存在栈上的数据 例如:在声明数组时,需要显示的指明数组的大小 0.2 动态内存分配 通俗一点就是向

    2024年02月11日
    浏览(48)
  • 【知识点随笔分享 | 第二篇】众多的字符集

    目录 前言: 字符与字符集: 字符集编码的发展(时间顺序): 总结:          你是否有好奇过文字是怎么在电脑中显示出来的?为什么我们通过输入法就可以输入想要得到的文字?为什么我们粘贴有些网站的文字,复制到自己的电脑上就成乱码?为什么我们有的时候

    2024年02月14日
    浏览(41)
  • MySQL 知识点分享一:utf8 字符集和排序规则

    我们经常能在数据库中看到这些: utf8mb4 和 utf8, utf8mb4_unicode_ci, utf8mb4_general_ci, utf8mb4_bin 分别代表什么意思呢? 其实他们表示的是字符集 和 排序规则 字符集:就是用来定义字符在数据库中的编码的集合。 排序规则:用来定义比较字符串的方式。 字符集和排序规则是一对多的关

    2024年02月07日
    浏览(48)
  • C语言知识点汇总

    C语言知识点保姆级总结,这不得进你的收藏夹吃灰?! 拖了很久的C语言所学知识的简单小结,内容有点多,第一次总结也可能有错误或者不全面,欢迎随时补充说明! ​ 用不同数据类型所定义的变量所占空间大小不一样,定义的变量不是保存于数据类型中,而是因为只有

    2024年01月23日
    浏览(51)
  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(51)
  • 计算机语言知识点梳理

    python是一门强类型、动态型、解释型语言语言 JavaScript是一门弱类型、动态性、解释型语言 typescript是一门强类型、静态型、编译型语言 Java是一门强类型、静态型、编译型语言 变量大小写区分 html css sql java javascript python typescript c 弱类型语言和强类型语言 强类型语言也称为强

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包