字符数组

C 语言字符数组和字符串

用来存放字符的数组称为字符数组,例如:

#include <stdio.h>
int main()
{char a[10]; //一维字符数组char b[5][10]; //二维字符数组char c[20] = { 'K', 'l', 'a', 'r', 'a', ' ', '1', '9', 'C' }; // 给部分数组元素赋值char d[ ] = { 'K', 'l', 'a', 'r', 'a', ' ', '1', '9', 'C' }; //对全体元素赋值时可以省去长度//有问题!!!getchar();return 0;
}

字符数组实际上是一系列字符的集合,也就是字符串(String)。
在 C 语言中,没有专门的字符串变量,没有 string类型,
通常就用一个字符数组来存放一个字符串。

C 语言可以将字符串直接赋值给字符数组,例如:

#include <stdio.h>
int main()
{char str1[30] = { "Klara 19C" };char str2[30] = "Klara 19C";//怎么习惯怎么来,甚至可以不写30getchar( );return 0;
}

数组第 0 个元素为’K’,第 1 个元素为’l’,第 2 个元素为’a’,后面的元素以此类推。
但是,字符数组只有在定义时才能将整个字符串一次性地赋值,
一旦定义完了,就只能一个字符一个字符地赋值了。

字符串结束标志

在 C 语言中,字符串总是以’\0’作为结尾,所以’\0’也被称为字符串结束标志,或者字符串结束符。
'\0’是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。
该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,
它在 C 语言中唯一的作用就是作为字符串结束标志。

C 语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到’\0’就认为到达了字符串的末尾,就结束处理。
‘\0’至关重要,没有’\0’就意味着永远也到达不了字符串的结尾。

  1. 由" "包围的字符串会自动在末尾添加’\0’。
  2. 当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为’\0’。
  3. 逐个字符地给数组赋值并不会自动添加’\0’
  4. 当用字符数组存储字符串时,要特别注意’\0’,要为’\0’留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。

当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,
这就为以后的错误埋下了伏笔,休要自己要多多注意

#include <stdio.h>
int main()
{char str[30] = { "Klara 19C Klara 19C Klara 19C Klara 19C" };putchar();return 0;
}

我的会报错

在函数内部定义的变量、数组、结构体、共用体等都称为局部数据。
在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。
这一点非常重要,大家一定要谨记,否则后面会遇到很多奇葩的错误。
这也是为什么我们一定要初始化。

#include <stdio.h>
int main()
{char str1[30] ;char str2[30] = {'\0'};char str3[30] = {0};return 0;
}

字符串的输入和输出

字符串的输出

  • puts():输出字符串并自动换行,该函数只能输出字符串。
  • printf():通过格式控制符%s 输出字符串,不能自动换行。
#include <stdio.h>
int main()
{char str[30] = "Klara 19C";puts(str);printf("%s", str);return 0;
}

printf() 输出字符串时,会从第 0 个元素开始往后检索,
直到遇见’\0’才停止,然后把’\0’前面的字符全部输出,
不但不能正确处理字符串,甚至还会毁坏其它数据。

字符串的输入

  • scanf():通过格式控制符%s输入字符串,无法读取含有空格的字符串,遇到空格就认为当前字符串结束了。
  • gets():直接输入字符串,遇到回车键时才认为字符串输入结束,换句话说,gets() 用来读取一整行字符串。
#include <stdio.h>
int main() {char str1[30] = {0};char str2[30] = {0};char str3[30] = {0};printf("Input: ");gets(str1);printf("Input: ");scanf("%s", str2);scanf("%s", str3);printf("\nstr1: %s\n", str1);printf("str2: %s\n", str2);printf("str3: %s\n", str3);return 0;
}

scanf()也可以整行读入,自己查吧。

注意,scanf() 在读取数据时需要的是数据的地址,这一点是恒定不变的,
所以对于 int、char、float 等类型的变量都要在前边添加&以获取它们的地址。
但是因为字符串名字或者数组名字在使用的过程中一般都会转换为地址,
所以再添加&就是多此一举,甚至会导致错误了。

至于数组名字(字符串名字)和地址的转换细节,
以及数组名字什么时候会转换为地址,我们下节课讲指针的时候会讲。

C语言基础 - 字符数组相关推荐

  1. c++把数组所有元素剔除_C语言基础之数组,第一节,C语言必学知识点剖析

    本文约1600字,主要讲了C语言基础之数组.数组又可分为数值数组.字符数组.指针数组.结构数组等各种类别.本文主要讲了数组的基础概念,一维数组的定义和引用. 带你进入C语言的世界,入门C语言,后边将持 ...

  2. C语言基础:数组作为函数参数传递演示源码

    将做工程过程中常用的内容片段记录起来,如下内容内容是关于C语言基础:数组作为函数参数传递演示的内容,应该能对小伙伴也有好处. #include <stdio.h>void show_arr ...

  3. C语言中字符数组的初始化与注意事项

    在C语言中字符数组的初始化有三种常见的方法: char a[5] = {'a','b','c','d','e'};char c[] = {'a','b','c','d','e'};char b[] = ...

  4. C语言基础专题 - 数组(编辑中)

    C语言基础专题 - 数组 本文介绍了C语言中数组地相关知识 阅读本文前推荐阅读:C语言数据类型 阅读本文后推荐阅读:C语言结构体 阅读本文后推荐阅读:C语言字符串 其它推荐阅读:python序列 1.

  5. C语言中字符数组的初始化与赋值,字符串相关函数

    C语言中字符数组的初始化与赋值,字符串相关函数! 1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. (1)直接逐个初始化字符数组 ...

  6. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  7. C语言关于字符数组接受字符串解析

    C语言关于字符数组接收字符串解析 前言:在一道算法题中遇到了一个让我很诧异的问题,strlen为什么得不到正确的长度.答案是我对字符数组进行的是赋值操作,不会自动补'/0'. 本文从三个角度分析问题, ...

  8. c语言取字符数组最后几位

    c语言取字符数组最后几位 #include<stdio.h>int main (){char s[] = "123253426" ;char *t = &s[2 ...

  9. ioS开发之c语言基础-一维数组,字符数组

    // //  main.m //  C4-一维数组,字符数组 // //  Created by dllo on 15/10/8. //  Copyright (c) 2015年 dllo. All ...

最新文章

  1. 树莓派开发4-串口通讯wiringpi库
  2. 什么是滚动灯箱的全数字滚动系统?
  3. 光伏价格趋势:中美因素汇聚 市场需求向7月延伸
  4. pc调试微信h5页面
  5. 当我们在谈论内存时,我们在谈论什么
  6. 更改微信小程序的基础版本库;更改uni-app小程序基础库;更改用户的微信小程序基础库最低版本;设置用户的微信小程序版本库;
  7. java处理url中的特殊字符%等
  8. phpstorm统计程序行数_Python 实现代码行数统计
  9. java 工作流引擎调研总结
  10. ConfuserEx 脱壳软件 使用教程
  11. 计算机没有无线网卡驱动程序,电脑上没有光驱怎么安装无线网卡驱动 - 驱动管家...
  12. vim的大小写转换方法总结
  13. git push报错 [remote rejected] HEAD (no new changes) error
  14. EFM32 LG232系列单片机干货之LEUART
  15. 关于Bmob的后端云的使用---傻瓜式数据库操作
  16. Install Ubuntu18.04.1 and Win7 on A53S
  17. 《实战 Linux Socket 编程》Warren W.Gay 图解Key-point学习笔记-1
  18. java 时区 edt_JAVA TimeZone发行EDT对EST
  19. Flash时钟制作(注意:不是钟表式的)
  20. Python实现十进制数与二进制补码转换

热门文章

  1. 计算机毕业设计springboot+vue+elementUI 广场舞团高校舞蹈社团管理系统
  2. MATLAB Latex中如何实现换行
  3. 数学知识整理:仿射函数(affine function)
  4. gazebo中导入sdf文件
  5. 模糊搜索工具fzf的安装和使用
  6. mysql一键安装脚本
  7. Java学习笔记-StringUtil.isBlank和isEmpty
  8. Raspberry Pi Pico代替鼠标和键盘操作
  9. apk破解工具,使用android Killer 踩过的坑
  10. 智能手表音频特性测试_儿童手表电磁辐射测试这一环节不可少