第3章 数组和字符串
3.2 字 符 数 组
文本处理在计算机应用中占有重要地位。在C语言中,字符串其实就是字符数组——可以像处理普通数组一样处理字符串,只需要注意输入输出和字符串函数的使用。
例3-3 竖式问题。
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。
样例输入:2357 样例输出: <1> ..775 x..33 ----- .2325 2325. ----- 25575
The number of solutions=1 【分析】
本题的解题策略是尝试所有的abc和de,判断是否满足条件。写出如下的伪代码:
char s[20]; int count = 0; scanf(\
for(abc = 111; abc <= 999; abc++) for(de = 11; de <= 99; de++)
第 60页
第3章 数组和字符串
if(“abc*de”是个合法的竖式) { printf(\ 打印abc*de的竖式和其后的空行 count++; }
printf(\
说明:(1)char s[20]是一个定义字符数组的语句,scanf(\表示从键盘输入一个字符串给字符数组s。
(2)char是“字符型”的意思,而字符是一种特殊的整数。每一个字符都有一个整数编码,称为ASCII码。C语言中允许用直接的方法表示字符,还有以反斜线开头的字符(转义序列,Escape Sequence)。
(3)在stdlib.h中有一个函数atoi,它的函数原型如下:
int atoi(char *s)
它表示将字符串s中的内容转换成一个整型数返回,如字符串“1234”,则函数返回值是1234。
(4)在stdlib.h中有一个函数itoa,它的函数原型如下:
char *itoa(int value,char *string,int radix)
它表示将整数value转换成字符串存入string, radix为转换时所用基数(保存到字符串中的数据的进制基数 2 8 10 16),返回指向转换后的字符串的指针 。
例如,itoa(32,string,10)是将32变成十进制数一个字符串“32”,并返回指向这个字符串的指针;itoa(32,string,16)是将32变成十进制数一个字符串“20”,并返回指向这个字符串的指针。
(5)stdlib 头文件即standard library标准库头文件,该文件包含了的C语言标准库函数的定义,声明了数值与字符串转换函数, 伪随机数生成函数, 动态内存分配函数, 进程控制函数等公共函数。 输入样式: C语言模式:#include
C++样式:#include
提示3-7:C语言中的字符型用char表示,它实际存储的是字符的ASCII码。字符常量可以用单引号法表示。在语法上可以把字符当作int型使用。
第 61页
第3章 数组和字符串
语句scanf(\s);表示读入一个不含空格、TAB和回车符的字符串,存入字符数组s中,s前面没有&符号。
提示3-8:在scanf(\中,不要在s前面加上&符号。如果是字符数组char s[MAXN] [MAXL],可以用scanf(\读取第i个字符串。
接下来有两个问题:判断和输出。先考虑输出。首先计算第一行乘积x=abc*e,然后是第二行y=abc*d,最后是总乘积z=abc*de,然后一次性打印出来:
printf(\完整程序如下:
程序3-4 竖式问题
#include
int i, ok, abc, de, x, y, z, count = 0; char s[20], buf[99]; scanf(\
for(abc = 111; abc <= 999; abc++) for(de = 11; de <= 99; de++) {
x = abc*(de); y = abc*(de/10); z = abc*de;
sprintf(buf, \ ok = 1;
for(i = 0; i < strlen(buf); i++) if(strchr(s, buf[i]) == NULL) ok = 0; if(ok) {
printf(\
printf(\ } }
printf(\ return 0; }
说明:(1)sprintf函数
第 62页
第3章 数组和字符串
sprintf是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数。
功能:把格式化的数据写入字符串buf,它的返回值是字符串长度。包含此函数的头文件是stdio.h。
例如,本程序中的sprintf(buf,\语句的功能是将整数abcdexyx打印成字符串存储在串buff中。可以直接接受其返回值:
int len=sprintf(buf, \
(2)strchr函数 strchr函数定义如下:
char *strchr(const char *s,char c);
功能:查找字符串s中首次出现字符c的位置。它的返回值是返回首次出现c的位置的指针,如果s中不存在c则返回NULL。包含此函数的头文件是string.h。
例如,本程序的if语句中strchr(s, buf[i])的功能是查找字符串s中首次出字符buf[i]的位置。如果strchr(s, buf[i])==NULL,则表明字符串s中没有buf[i]的字符。
(3)sprintf函数、printf函数、fprintf函数的区别
printf输出到屏幕,fprintf输出到文件,而sprintf输出到字符串。需要注意是应该保证写入的字符串有足够的空间。
提示3-9:可以用sprintf把信息输出到字符串,用法和printf、fprintf类似。但你应当保证字符串足够大,可以容纳输出信息。
字符串的空间应为字符个数加1,这是因为C语言的字符串是以空字符'\\0'结尾的。
函数strlen(s)的作用是获取字符串s的实际长度,即函数strlen(s)返回的是结束标记之前的字符个数(需包含头文件string.h)。因此这个字符串中的各个字符依次是s[0],s[1],?,s[strlen(s)-1],而s[strlen(s)]正是结束标记'\\0'。
第 63页

