C语言基础 - 字符数组

字符数组

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";
    //怎么习惯怎么来,甚至可以不写30
    getchar( );
    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 等类型的变量都要在前边添加&以获取它们的地址。
但是因为字符串名字或者数组名字在使用的过程中一般都会转换为地址,
所以再添加&就是多此一举,甚至会导致错误了。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值