1.9 C语言之字符数组

1.9 C语言之字符数组

一、字符数组概述

所谓字符数组,就是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;
}

二、练习

  1. 修改打印最长文本行的程序的主程序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表示实际输入的字符数
}
  1. 编写一个程序,打印长度大于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表示实际输入的字符数
}
  1. 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
#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;
}
  1. 编写函数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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值