1.9 字符数组
- 一、字符数组概述
- 二、练习
一、字符数组概述
所谓字符数组,就是char类型的数组,比如 char a[],是C语言中最常用的数组类型,先看一个程序
#include <stdio.h>
#define MAXLINE 1000 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
void copy(char to[], char from[]); // 数组拷贝// 打印所有输入行中长度最长的行
main()
{int len; // 当前行长度int max; // 最大长度char line[MAXLINE]; // 保存当前输入行char longest[MAXLINE]; // 保存最长的行max = 0;while ((len = getline(line, MAXLINE)) > 0) {if (len > max) {max = len;copy(longest, line);}}if (max > 0)printf("%s", longest);return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i;for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)s[i] = c;if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}// 返回值类型为void,显式说明该函数不返回任何值
void copy(char to[], char from[]) {int i;i = 0;while ((to[i] = from[i]) != '\0')++i;
}
以上的程序功能就是,从输入的多行文本中,找出最长的一行文本,进行打印。值的说明的是:
- getline函数把字符 ‘\0’ (即空字符,其值为0,可以用 printf(“%d%c%d”, ‘\0’, ‘\0’, ‘\0’); 体会一下) 插入到数组的末尾,以标记字符串的结束。这一约定已被C语言采用:当在C语言程序中出现类似于 “hello\0” 的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并以’\0’标志字符串的结束。printf函数的%s规定,对应的参数必须是以这种形式表示的字符串
#include <stdio.h>main()
{printf("%d%c%d\n", '\0', '\0', '\0');char chars[3];chars[0] = '0';chars[1] = '1';//chars[2] = '2';chars[2] = '\0';printf("%s", chars);return 0;
}
二、练习
- 修改打印最长文本行的程序的主程序main, 使之可以打印任意长度的输入行,并尽可能多的打印文本。
为了便于测试,把MAXLINE 改成10
根据上述分析,显然有两个问题
① 输出的长度最大是9
② 打印的数组出现未知值
这就是这个题目要解决的问题:打印任意长度,打印正确的数组
修改点(其他与原程序相同):
main函数中,printf("%d, %s", len, line);
getline函数,重写
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}
- 编写一个程序,打印长度大于80个字符的所有输入行。
#include <stdio.h>
#define MAXLINE 1000 //最大行长度限制
#define MAXCHAR 80 // 行字符数
int getline(char line[], int maxline); // 读取一行// 编写一个程序,打印长度大于80个字符的所有输入行。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {if (len > MAXCHAR) {printf("%d, %s", len, line);}}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}
- 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
#include <stdio.h>
#define MAXLINE 10 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
int remove(char line[]); // 删除行尾空格和制表符、删除完全是空格的行,并返回其他字符占有数组的长度// 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {if(remove(line) > 0)printf("%d, %s", len, line);}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}// 删除行尾空格和制表符、删除完全是空格的行,并返回其他字符占有数组的长度
int remove(char s[]) {int i;i = 0;while (s[i] != '\n')++i;--i;// 从\n前的一个字符开始,往前退,// 如果是空格或制表符,继续往前退,// 如果不是空格和制表符,或者字符串已经遍历完(i=0),退出循环while (i>0 && (s[i] == ' ' || s[i] == '\t'))--i;return i;
}
- 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
#include <stdio.h>
#define MAXLINE 10 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
void reverse(char line[]); // 反转字符串
// 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {reverse(line);printf("%d, %s", len, line);}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}void reverse(char s[]) {int i, j; // 两个游标,i从数组的后面往前移,j从前往后移char temp; // 临时变量,用于交换两个数组元素i = 0;while (s[i] != '\0')++i;--i;if (s[i] == '\n')--i;j = 0;while (j < i) {temp = s[j];s[j] = s[i];s[i] = temp;--i;++j;}
}