标准c语言实现通讯录(CGI)

自学,手打,希望多多点赞评论支持,让更多需要的人看见!——花前月

一、配置CGI运行环境——Apache下载安装

下载

阿帕奇豪斯下载 (apachehaus.com)

请添加图片描述

解压缩

在这里插入图片描述

修改配置

修改conf/httpd.conf

在这里插入图片描述

修改Apache存放路径为解压路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBM88YgN-1654222086601)(image/image_FgPvtFEhdn.png)]

修改监听窗口为8086

修改Server Name为127.0.0.1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDaN7o2W-1654222086602)(image/image_j1lR98tbdZ.png)]

修改conf/extra/httpd-ahssl.conf和httpd-ssl.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bN15fwS6-1654222086602)(image/image_ssPGE26qu5.png)]

将两个文件的443端口改为444(只要端口不被占用就行)

在这里插入图片描述

测试配置文件是否合法

httpd -t #测试配置文件是否合法

添加环境变量

启动Apache服务

1、使用管理员身份打开cmd(win+R,输入cmd,按ctrl+shift+enter打开),安装Apache服务

httpd -k install -n Apache2.4 #-n后面表示自定义访问名称

在这里插入图片描述

2、启动Apache服务

http -k start

3、查看服务是否启动成功

也可通过此处打开关闭Apache服务

4、测试——在浏览器访问http://127.0.0.1:8086,出现以下页面表示配置成功。

之后我们可以通过修改Apache24\htdocs目录下的index.html文件来更改这个初始页面。

5、停止服务

httpd -k stop   #停止

在这里插入图片描述

二、测试CGI功能

用VS2022新建一个控制台应用程序工程,在主函数中写入:

cout << "Content-type:text/html\n\n";//告诉浏览器将以html的语法来解析此文件
cout << "Hello world";

在这里插入图片描述

先别急着编译,我们先在工程上点右键,选择属性:

在这里插入图片描述

在配置设置-常规中,更改输出目录为cgi-bin下

在这里插入图片描述

在配置属性-高级中更改目标文件的扩展名成cgi

在这里插入图片描述

编译后,我们来到cgi-bin中,就可以看到我们编译生成好的"test.cgi"文件。

在这里插入图片描述

启动Apache服务后,在浏览器中输入localhost/cgi-bin/test.cgi就可以看到hello world了

在这里插入图片描述

只要通过printf或cout,就可以将任何html代码输出在浏览器里。而且,因为是用C/C++写的程序,所以C/C++下的一切函数,都可以用在CGI程序里。

三、向Apache中添加通信录网页

在这里插入图片描述

打开Apache\htdocs,将通讯录网页放置到文件夹中,启动Apache服务后向浏览器中输入127.0.0.1:8086。

在这里插入图片描述

通讯录网页详细代码:

<html>
<head>
<meta charset="gb2312">
<!--规定 HTML 文档的字符编码-->
</head>

<body>
    <form  id ="form" name="form" method="get" action="http://127.0.0.1:8086/cgi-bin/test.cgi" >
    <!--表单数据作为 URL 变量(使用 method="get")发送-->
    <!--action 属性定义提交表单时要执行的操作——跳转到http://127.0.0.1:8086/cgi-bin/test.cgi-->
        
        <P>姓名
            <input type="text" id="name" name="name"/>
            <!--文本框-->
        </P>
        <p>年龄
            <select id="age" name="age">
            <!--下拉框-->
                <option value="18" selected="selected">18</option>
                <option value="19" >19</option>
                <option value="20" >20</option>
                <option value="21" >21</option>
            </select>
        </p>
        <P>性别
            <input type="radio" id="men" name="gender" value=""/><input type="radio" id="women" name="gender" value="" /><!--单选框-->
        </P>
        <P>手机
            <input type="text" id="phonenum" name="phonenum" />
            <!--文本框-->
        </P>
        <p>
            <input type="submit" name="submit" value="提交" />
            <!--提交按钮 - 单击将尝试提交表单到服务器-->
        </p>
    </form>
</body>
<script>
//脚本,检测输入是否合法
    var f = document.getElementById("form");
    var n = document.getElementById("name");
    var m = document.getElementById("men");
    var w = document.getElementById("women");
    var p = document.getElementById("phonenum");
    form.onsubmit = function(){
      
      
        if(n.value==''||n.value==null){
      
      
            alert('请填写姓名!');
            return false;
        }
        else if(!(m.checked||w.checked)){
      
      
            alert('请选择性别!');
            return false;
        }
        else if(p.value==''||p.value==null){
      
      
            alert('请填写手机号');
            return false;
        }
    }
</script>
</html>

测试通讯录网页

在这里插入图片描述

点击提交按钮后可在浏览器地址栏中看见URL 变量的表单数据,编码格式为gb2312。

http://127.0.0.1:8086/cgi-bin/test.cgi?name=%D5%C5%C8%FD&age=21&gender=%C4%D0&phonenum=13767898798&submit=%CC%E1%BD%BB

四、编写c语言代码

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

#define BURSIZE 2048

int hex2dec(char c)
{
    
    
    if ('0' <= c && c <= '9')
    {
    
    
        return c - '0';
    }
    else if ('a' <= c && c <= 'f')
    {
    
    
        return c - 'a' + 10;
    }
    else if ('A' <= c && c <= 'F')
    {
    
    
        return c - 'A' + 10;
    }
    else
    {
    
    
        return -1;
    }
}
char dec2hex(short int c)
{
    
    
    if (0 <= c && c <= 9)
    {
    
    
        return c + '0';
    }
    else if (10 <= c && c <= 15)
    {
    
    
        return c + 'A' - 10;
    }
    else
    {
    
    
        return -1;
    }
}
void urldecode(char url[])//url解码函数,gb2312
{
    
    
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    char res[BURSIZE];
    for (i = 0; i < len; ++i)
    {
    
    
        char c = url[i];
        if (c != '%')
        {
    
    
            res[res_len++] = c;
        }
        else
        {
    
    
            char c1 = url[++i];
            char c0 = url[++i];
            int num = 0;
            num = hex2dec(c1) * 16 + hex2dec(c0);
            res[res_len++] = num;
        }
    }
    res[res_len] = '\0';
    strcpy(url, res);
}
int main()
{
    
    
  char* str;
  char name[100], gender[100], ch[100], phonenum[100];
  char age[100];
    printf("Content-type:text/html;charset=gb2312;\n\n");//告诉浏览器将以html的语法,gb2312的编码格式来解析此文件
  str = getenv("QUERY_STRING");//获取通讯录网页提交的表单信息。
    if (str == NULL)
        return 0;
  if (sscanf(str, "name=%[^&]&age=%[^&]&gender=%[^&]&phonenum=%[^&]&submit=%s", name, age, gender, phonenum,ch)) {
    
    
    //使用sscanf()函数读取相关信息(使用正则表达式)
        urldecode(name);//解码
        urldecode(age);
        urldecode(gender);
        urldecode(phonenum);
        FILE* fpWrite = fopen("data.txt", "a");//打开data.txt文件,”a“表示续写内容
        if(fprintf(fpWrite, "%-25s%-10s%-10s%-20s\n", name, age, gender, phonenum))
            printf("<script>alert('非常感谢,您的数据已经被保存!'); </script>");//浏览器弹窗提示信息
        fclose(fpWrite);//关闭文件
  }
  printf("<html>\n");
    FILE* fpRead = fopen("data.txt", "r");
    printf("<table border=\"1\"width=\"600\"\n");//以表格形式读取文件
    while (!feof(fpRead))
    {
    
    
        
        if (fscanf(fpRead, "%s %s %s %s", &name, &age, &gender, &phonenum)==NULL)
            exit(-1);
        else if(!feof(fpRead)) {
    
    //避免文件最后一行重复输出
            printf("<tr>\n");
            printf("<td width=\"200\">\n%s\n</td>\n", name);
            printf("<td width=\"100\">\n%s\n</td>\n", age);
            printf("<td width=\"100\">\n%s\n</td>\n", gender);
            printf("<td width=\"200\">\n%s\n</td>\n", phonenum);
            printf("</tr>\n");
        }
    }
    printf("</table>\n");
    fclose(fpRead);
  printf("</html>\n");
}

编译后,新的cgi程序会输出到Apache24\cgi-bin。

Apache24\cgi-bin中新建data.txt,第一行中输入姓名、年龄、性别等信息

在浏览器中重新打开通讯录网页127.0.0.1:8086测试功能。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/WMX_0121/article/details/125110406