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;
}
}