字符数组和字符串

转载自劝学网,http://www.quanxue.cn/JC_CLanguage/CLang/Clang10.html,有微改。


一、字符数组和字符串的重定义

字符数组就是字符串吗?有人说是,因为书上这么写,教师也这么教的。小雅不敢说书上或教师们错了,但至少可以说许多初学者都混淆了这两个概念。因此,在这此将这2个概念再明确一下。

1.       字符数组,完整地说叫字符类型的数组。字符数组不一定是字符串。

2.       字符串是最后一个字符为NULL字符的字符数组。字符串一定是字符数组。

3.       字符数组的长度是固定的,其中的任何一个字符都可以为NULL字符。

4.       字符串只能以NULL结尾,其后的字符便不属于该字符串。

5.       strlen()等字符串函数对字符串完全适用,对不是字符串的字符数组不适用。

#include <stdio.h>
#include <string.h>
int main(void)
{
    //这是字符数组赋初值的方法
    char cArr[] ={'Q','U','A','N','X','U','E'};
    //这是字符串赋初值的方法
    char sArr[] = "quanxue";
 
    //用sizeof()求长度
    printf("cArr的长度=%d\n", sizeof(cArr));   //长度为7
    printf("sArr的长度=%d\n", sizeof(sArr));   //长度为8,最后一位是NULL
 
    //用printf的%s打印内容
    printf("cArr的内容=%s\n", cArr);   //不能正确显示
    printf("sArr的内容=%s\n", sArr);   //可以正确显示
 
    //用strlen()求长度
    printf("cArr的长度=%d\n",strlen(cArr));   //不正确的结果
    printf("sArr的长度=%d\n",strlen(sArr));   //NULL不在计算范围
 
    return 0;
}

输出结果1

从上面例子看来,还要注意以下几点:

1.       char sArr[] = "quanxue";这种方式,编译时会自动在末尾增加一个NULL字符。

2.       NULL字符也就是'\0',在ASCII表中排在第一个,用16进制表示为0x00。

3.       sizeof()运算符求的是字符数组的长度,而不是字符串长度。

4.       strlen()函数求的是字符串长度,而不是字符数组。它不适用于字符串以外的类型。

5.       char sArr[] = "quanxue";也可以写成charsArr[8] = "quanxue";(注意:是8而不是7)


二、字符串数组

字符串数组是二维字符数组,同样道理,二维字符数组不一定是字符串数组。

#include <stdio.h>
 int main(void)
{
    int i;
 
    //这是字符数组赋初值的方法,维数:4X2
    char cArr[][2] = {{'Q','U'},
                     {'A','N'},
                     {'X','U'},
                     {'E','\0'}};
    //这是字符串数组赋初值的方法,维数:4X3
    char sArr[][3] = {"qu","an","xu","e"};
 
    //用sizeof()求长度
    for (i=0; i<4; i++) {
        printf("%d: %d  %d\n", i, sizeof(cArr[i]), sizeof(sArr[i]));
        printf("[%s] [%s]\n",cArr[i], sArr[i]);
    }
 
    return 0;
}

输出结果2
从上面可以看出,cArr[i]的长度为2,sArr[i]的长度为3,因为多了一个NULL字符。 输出cArr[i]时,因为中间没有NULL字符,所以一直显示到有NULL为止


三、字符数组和字符串数组的转化

字符数组中插入一个NULL字符,NULL字符前面(包括NULL字符)就成了字符串,一般NULL字符插在有效字符的最后。

#include <stdio.h>
#include <string.h>
int main(void)
{
    //因为最后有NULL,所以这就变成了字符串
    char cArr[] = {'Q', 'U', 'A', 'N', 'X','U', 'E', '\0'};
    //因为少定义了一位,最后无NULL,所以这就变成了字符数组
    char sArr[7] = "quanxue";
    //最后一个元素未赋值
    char tArr[16] = "www.quanxue.cn";
 
    //用sizeof()求长度
    printf("cArr: %2d ,%2d\n",strlen(cArr), sizeof(cArr));
    printf("sArr: %2d ,%2d\n",strlen(sArr), sizeof(sArr));
    printf("tArr: %2d ,%2d\n",strlen(tArr), sizeof(tArr));
 
    //将tArr的最后一个元素赋值,字符串就成了字符数组
    tArr[15] = '!';
 
    //作为字符数组,将显示16个字符
    for (i=0; i<16; i++) printf("%c",tArr[i]);  //字符数组的显示方法
    //作为字符串,将显示14个字符。
    printf("\n%s\n", tArr);     //字符串的显示方法
 
    return 0;
}

输出结果3

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值