📜  LEX 程序打印最长的字符串并找到给定数字的平均值(1)

📅  最后修改于: 2023-12-03 15:32:38.629000             🧑  作者: Mango

LEX程序打印最长的字符串并找到给定数字的平均值

本程序是基于LEX语言编写的,它可以读取用户输入的字符串,并输出其中最长的字符串。此外,它还可以计算用户输入的数字的平均值。

LEX程序代码

下面是LEX程序的完整代码:

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char longest_str[100];
int current_len = 0;
int n_sum = 0;
int n_count = 0;
%}

%%
. {
    current_len++;
}

\n {
    if (current_len > strlen(longest_str)) {
        sprintf(longest_str, "%.*s", current_len-1, yytext);
    }
    current_len = 0;
}

[0-9]+ {
    n_sum += atoi(yytext);
    n_count++;
}

%%

int main() {
    yylex();
    printf("Longest string: %s\n", longest_str);
    printf("Average of numbers: %s\n", (n_count > 0) ? (n_sum/n_count) : "N/A");
    return 0;
}
代码说明

LEX程序的代码由三个部分组成:

  1. 宏定义部分(%{}):这里包含了所需要引用的头文件,以及声明一些变量。其中,longest_str变量是用于存储目前发现的最长字符串的数组;current_len变量是用于记录当前正在读取的字符串的长度;n_sum变量是用于存储输入数字的总和;n_count变量是用于记录输入数字的数量。
  2. 规则部分(%%):这里定义了LEX程序对输入字符串如何进行解析。.规则表示对于任何一个非换行符的字符,当前字符串的长度current_len都需要加1;\n规则表示读取到换行符时,需要将当前字符串与已经找到的最长字符串比较,如果当前字符串更长,就将其存储到longest_str变量中,并重置current_len变量。
  3. 主函数部分:这里是LEX程序的主函数,主要是调用yylex()函数来读取用户输入的字符串,并输出计算结果。如果用户输入了数字,它会将这些数字的总和存储到n_sum变量中,并将计数器n_count加1。当用户输入完毕后,它会输出已经发现的最长字符串,以及计算出的平均值(如果有输入数字,则输出其平均值,否则输出"NA")。
如何使用

要使用此程序,只需将其复制到一个文件中(假设文件名为program.lex),然后使用以下命令来编译它:

lex program.lex
gcc -o program lex.yy.c -ll

编译成功后,输入以下命令运行程序:

./program

接着根据程序提示输入需要处理的字符串,以及一些整数。程序会输出其中最长的字符串,并计算输入的整数的平均值。

总结

本程序基于LEX实现了一个针对用户输入字符串的分析工具,它可以帮助用户查找出最长的字符串,并计算输入整数的平均值。此工具的实现过程中,我们需要深入了解LEX程序的结构和语法,以便能够正确地解析用户输入的数据。