用来存放字符量的数组称为字符数组。字符串可以看作一个数组,它的元素是字符型的。

字符数组的定义

形式与前面介绍的数值数组相同。例如:

char c[10];

由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。

字符数组也可以是二维或多维数组。例如:

char c[5][10];

即为二维字符数组。

字符数组的初始化

字符数组也允许在定义时作初始化赋值。例如:

char c[10]={‘c’, ‘  ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};

赋值后各元素的值为:

c[0]的值为‘c’

c[1]的值为‘’

c[2]的值为‘p’

c[3]的值为‘r’

c[4]的值为‘0’

c[5]的值为‘g’

c[6]的值为‘r’

c[7]的值为‘a’

c[8]的值为‘m’

其中c[9]未赋值,由的值为‘p’系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如:

char c[]={'c', ' ', 'p', 'r', 'o', 'g','r', 'a', 'm' };

这时C数组的长度自动定为9。

字符数组的引用

#include <stdio.h>
#include <stdlib.h> int main(void)
{
inti, j;
chara[][5] = { { 'H', 'e','l', 'l', 'o', }, { 'w', 'o', 'r', 'l', 'd' } };
for(i = 0; i <= 1; i++){
for(j = 0; j <= 4; j++)
printf("%c", a[i][j]);
printf("\n");
} system("pause");
return0;
}

运行结果:

本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。

字符串和字符串结束标志

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

C语言允许用字符串的方式对数组作初始化赋值。例如:

char c[]={'c', '','p','r','o','g','r','a','m'};

可写为:

char c[]={"C program"};

或去掉{}写为:

char c[]="C program";

用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:

‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。

字符数组的输入输出

在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。

#include <stdio.h>
#include <stdlib.h> int main(void)
{
charc[] = "Hello\nWorld";
printf("%s\n", c); system("pause");
return0;
}

运行结果:

注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf("%s",c[]);

#include <stdio.h>
#include <stdlib.h> int main(void)
{
charst[15];
printf("输入一个字符串:\n");
scanf("%s", st);
printf("%s\n", st); system("pause");
return0;
}

运行结果:

本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。

从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。

在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存可表示如图。

设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c)时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。

字符串处理函数

C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。

下面介绍几个最常用的字符串函数。

字符串输出函数 puts

格式:  puts (字符数组名)

功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。

#include <stdio.h>
#include <stdlib.h> int main(void)
{
charc[] = "Hello world!\n";
puts(c); system("pause");
return0;
}

运行结果:

从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。

字符串输入函数gets

格式:  gets  (字符数组名)

功能:从标准输入设备键盘上输入一个字符串。

本函数得到一个函数值,即为该字符数组的首地址。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
charst[15];
printf("输入一个字符串:\n");
gets(st);
puts(st);
system("pause");
return0;
}

运行结果:

出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。

字符串连接函数strcat

格式:  strcat (字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
staticcharst1[30] = "My name is ";
intst2[10];
printf("输入你的名字:\n");
gets(st2);
strcat(st1, st2);
puts(st1); system("pause");
return0;
}

运行结果:

本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。

字符串拷贝函数strcpy

格式:  strcpy (字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

#include <stdio.h>
#include <stdlib.h> int main(void)
{
charst1[15], st2[] = "Hello World!";
strcpy(st1, st2);
puts(st1);
printf("\n"); system("pause");
return0;
}

本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。

字符串比较函数strcmp

格式:  strcmp(字符数组名1,字符数组名2)

功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

字符串1=字符串2,返回值=0;

字符串2〉字符串2,返回值〉0;

字符串1〈字符串2,返回值〈0。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。

#include <stdio.h>

#include <stdlib.h>

int main(void)
{
intk;
staticcharst1[15], st2[] = "Hello World!";
printf("输入一个字符串:\n");
gets(st1);
k = strcmp(st1, st2);
if(k == 0) printf("st1=st2\n");
if(k > 0) printf("st1>st2\n");
if(k < 0) printf("st1<st2\n"); system("pause");
return0;
}

本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1>st2”。

#include <stdio.h>
#include <stdlib.h> int main(void)
{
intk;
staticcharst[] = "Hello World!";
k = strlen(st);
printf("字符串的长度是: %d\n", k); system("pause");
return0;
}

测字符串长度函数strlen

格式:  strlen(字符数组名)

功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。

C语言入门(18)——数组与字符串的更多相关文章

  1. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

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

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

  3. C语言中字符数组和字符串指针分析

    这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...

  4. C语言基础:数组和字符串

    数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4 ...

  5. C语言中的数组与字符串

    1. 数组与指针: 对于数组,需要注意两点:1, C语言中只有一维数组, 而且数组的大小必须在编译期就作为一个常数确定下来: 2. 对于一个数组,我们只能做两件事:确定数组的大小 和 获得指向该数组下 ...

  6. 小学生都看得懂的C语言入门(3): 数组与函数

    #include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...

  7. C语言实例:数组与字符串

    数组: #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE(Array) (sizeof (Array) / s ...

  8. Perl语言入门--2--变量与字符串

    一.$ 简单变量:$          以$开头+字母或下划线 区分大小写,变量长度不限,没有关键字,但不能和默认变量重复 1.整数的表示: 12 12e2 #1200 -12 #-12 1_200_ ...

  9. 小学生都看得懂的C语言入门(4): 数组与函数

    // 之前判断素数, 只需要到sqrt(x)即可,//更加简单的, 判断能够比已知的小于x的素数整除, 运行更快 #include <stdio.h> // 之前判断素数, 只需要到sqr ...

  10. 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串

    [字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...

随机推荐

  1. Android上使用OpenglES2.0遇到的一点问题

    按照教程开发OpenglES2.0应用,遇到Logcat报错“Called unimplemented OpenGL ES API” 在论坛和stackoverflow上找到了答案. 1.manife ...

  2. 重写 libev 的 EV_WIN32_HANDLE_TO_FD

    libev 的 EV_WIN32_HANDLE_TO_FD 默认实现是调用C库的  _open_osfhandle ,但这里有个问题是转换后,关闭 fd 就默认关闭了 handle.当它遇到 libc ...

  3. 【HDU 4451 Dressing】水题,组合数

    有衣服.裤子.鞋数量分别为n,m,k,给出p对不和谐的衣-裤或裤-鞋搭配,问一共有多少种和谐的衣裤鞋的搭配. 全部的组合有Cn1Cm1Ck1种. 设p对中有p1对衣-裤,p2对裤-鞋,则不和谐的搭配共 ...

  4. OpenStack ceilometer部署安装监控,计费数据抓取测试Ok

  5. 谈谈 WLST Custom Commands

    在了解WLST定制命令之前,简单说一下WLST,WLST 全称叫Weblogic Scripting Tool, 它提供了一组预定义命令来方便Weblogic的用户通过命令行对Weblogic 实例, ...

  6. 移动前端之viewport

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...

  7. mode(思维,注意内存)

    mode Time Limit:1000MS     Memory Limit:1024KB     64bit IO Format:%lld & %llu Submit Status Pra ...

  8. 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7 ...

  9. JS实现文本复制与剪切

    我们在网页上放置一个复制按钮,主要用来方便用户复制链接之类的复杂文本,以往的做法是,通过JS依靠Flash,甚至借助jQuery庞大的js库来实现文本复制到剪贴板的.今天我要给大家介绍的是一款极现代的 ...

  10. oracle归档日志管理

    归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档 ...