C语言数组与字符数组详解:统计字符与最长行提取

温以宁
温以宁
发布时间:2026-10-13 | 3人浏览过
原创

在C语言编程中,数组是处理批量数据的核心结构,而字符数组则专门用于字符串处理。本文将通过两个具体的代码案例,阐述如何利用数组下标进行高效计数,以及如何通过自定义函数操作字符数组来实现文件行的读取与复制,帮助读者深入理解变量声明、循环控制及函数传参机制。

统计各类字符数量

为了演示数组的实际应用,我们编写一个程序来统计输入流中各个数字(0-9)、空白符(空格、制表符、换行符)以及其他字符出现的次数。虽然该程序实用意义有限,但能很好地涵盖C语言多方面的特性。

第1步:初始化与变量声明

将所有输入字符归为几大类后,使用数组存放计数值比使用多个独立变量更简洁。首先声明一个整型数组 ndigit[10] 用于存储10个数字的频次,并初始化所有元素为0。同时声明空白符计数器 nwhite 和其他字符计数器 nother。

#include <stdio.h>
/* count digits, white space, others */
main()
{
 int c, i, nwhite, nother;
 int ndigit[10];
 nwhite = nother = 0;
 for (i = 0; i < 10; ++i)
  ndigit[i] = 0;
 while ((c = getchar()) != EOF)
  if (c >= '0' && c <= '9')
   ++ndigit[c-'0'];
  else if (c == ' ' || c == '\n' || c == '\t')
   ++nwhite;
  else
   ++nother;
 printf("digits =");
 for (i = 0; i < 10; ++i)
  printf(" %d", ndigit[i]);
 printf(", white space = %d, other = %d\n", nwhite, nother);
}

第2步:利用ASCII码进行下标映射

C语言中数组下标从0开始,因此10个元素分别为 ndigit[0] 到 ndigit[9]。程序中 c - '0' 的写法依赖于字符集中数字字符具有连续递增值的特性。由于 char 类型本质上是小整型,'0' 到 '9' 对应的数值是连续的,这使得计算出的差值可以直接作为合法的下标索引。

第3步:多路判定逻辑

程序主体采用 if-else if-else 结构对字符进行分类判断:
1. 若字符介于 '0' 到 '9' 之间,则对应数字数组计数加1;
2. 若是空格、换行或制表符,则空白符计数加1;
3. 其他情况归为“其他”类别。
这种结构要求条件从上到下依次求值,一旦满足即执行对应语句并跳出整个判断块。良好的缩进风格有助于保持逻辑清晰。

查找并打印最长文本行

接下来,我们通过一个更复杂的任务来引入字符数组和操作函数的概念:读入一组文本行,找出并打印其中最长的行。这涉及三个核心模块:读取行、保存行和控制流程。

第4步:定义辅助函数 getline

getline 函数的目的是读取下一行输入并存入数组 s,同时返回行长度。如果读到文件末尾,返回0。该函数通过 return i; 将读取到的字符数(含换行符)传递给调用者。

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

第5步:实现字符串拷贝函数 copy

当发现新行比当前记录的最长行更长时,需将其备份。copy 函数负责将源字符串复制到目标数组。由于C语言字符串以空字符 '\0' 结尾,该函数通过循环逐个复制字符直到遇到结束符,确保目标数组也是有效的字符串。

void copy(char to[], char from[])
{
 int i;
 i = 0;
 while ((to[i] = from[i]) != '\0')
  ++i;
}

第6步:主函数流程控制

在 main 函数中,我们定义了两个最大长度为 MAXLINE 的字符数组:line 用于暂存当前行,longest 用于保存历史最长行。通过 while 循环不断调用 getline,若长度大于已知最大值 max,则更新 max 并调用 copy 进行保存。最后输出保存的最长行。

此外,需注意内存安全性问题。例如 getline 必须检查数组是否溢出,而 copy 调用者需确保目标空间足够大。虽然本示例为了简洁未包含复杂的边界检查逻辑,但在实际工程中应当注意这些潜在风险。

以上就是关于C语言数组及字符数组的使用与原理的详细内容,更多关于C语言基础编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表