我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言如何实现简易文本编辑器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言如何实现简易文本编辑器

这篇文章主要介绍了C语言如何实现简易文本编辑器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

C语言是什么

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。

本程序要求完成一个简易文本编辑器,能够完成文本的录入、编辑、删除、查找,并能够完成文件的存取。

在文本编辑软件中把用户输入的所有文本内容作为一个字符串。虽然各种文本编辑软件的功能有强弱差别,但是基本操作都包括串的输入、修改、删除(包括整行删除和一行中的子串删除)、查找、输出等。通过分析,系统应该包括以下功能:

具有简单的文字或图形菜单界面
2、能实现串或文本块的查找、替换、删除、插入、移动操作。
3、能实现文本文件的存盘和读取功能。
4、具有友好的界面和较强的容错能力

设计思路

1、采用的逻辑结构

文本编辑器主要是针对文本进行编辑,文本的操作就是对字符的操作。文本编辑器可以从行、列两个方向进行编辑。

每一行可以看成一个线性表,线性表是一种线性结构,线性结构的特点是数据元素之间为线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,由于每一行可以存储的最大字数是相同的,行方向所有线性表的最大长度可以设置成相同的。行与行之间的关系也可以看成一个线性表。

2、采用的存储结构

线性表的存储分为两种:顺序存储和链式存储。

顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序表的数据存储区域是再合适不过的。

链式存储是通过-组任意的存储单元来存储线性表中的数据元素的,为建立数据元系之间的线性关系,对每个数据元素除了存放数据元素自身的信息之外,还需要和一起存放其后继或前驱所在的存储单元的地址,这两部分信息组成一个“结点”,每个元素都如此。存放数据元素信息的称为数据域,存放其前驱或后继地址的称为指针域。只有一个存储单元地址的为单链表,有两个存储单元地址的为双链表。

考虑到实际的功能需求,每行的线性表可以用顺序存储方式,每个字符是一个节点。用数组的长度表示本行可以输入的最大字符。行与行之间的线性表采用双链表存储,每个节点包括四个区域,一个指针域prior指向上一行,一个指针域next指向下一行,一个数据域num是行号,一个数据域是本行的字符数组。程序以行和列标识文本位置,行采用双向链表存储行信息,用数组下标标识列信息,从而能够准确定位字符位置,然后进行查找、替换、插入、块移动、删除等多种操作。

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_LEN 100#define NOT_FOUND -1//定义行结构体:struct line{ char text[MAX_LEN];  //本行文本 int num;  //行号 struct line *next; //指向下一个行的指针 struct line *prior; //指向前一个行的指针};int lnum;struct line *start;     //指向线性表中第一行的指针struct line *last;     //指向线性表中最后一行的指针struct line *find(int);    //查找指定行是否存在void patchup(int, int);    //对当前行以后的每行的行号加1或void delete_text(int);     //删除一行文字void list();   //显示文件的全部内容void save();   //保存文件void load();   //打开文件,初始化线性表void insert(char str[], int linenum, int position); //插入文字到一行的中间void printline(int linenum);   //打印一行文字void deletestr(int linenum, int position, int lenth); //删除一个字符串int findstr(char * to_find);  //查找字符串int menu_select();        //显示主菜单int menu_select_insert();//显示插入功能子菜单int menu_select_delete();//显示删除功能子菜单int menu_select_print(); //显示打印功能子菜单int menu_select_move();  //显示移动功能子菜单void enter(int linenum); //插入一行文字void enter_empty(int linenum); //插入一个空白行//下列函数是系统主函数,提供系统主界面,通过选择项转入执行插入、删除、查存盘、读人文件等功能的界面。int main(void){ char str[MAX_LEN]; int choice; int linenum = 1; int number = 0; start = NULL; last = NULL; load(); //打开文件,初始化线性表 do{  choice = menu_select();  switch (choice)  {  case 1:  //执行插入功能    choice = menu_select_insert();//显示插入子菜单   switch (choice)   {   case 1:   //插入一行    printf("\t行号:");    scanf("%d", &linenum);    enter(linenum);    break;   case 2:  //插入到指定行的指定列    printf("输入插入位置一行号:");    scanf("%d", &linenum);    printf("输入插入位置-列号:");    scanf("%d", &number);    printf("要插入的字符串:");    scanf("%s", str);    insert(str, linenum, number);    break;    case 3:   //退出插入    break;   }   break;  case 2:   //执行删除功能   choice = menu_select_delete();  // 删除子菜单   switch (choice)   {   case 1:   //删除指定行    printf("\t行号:");    scanf("%d", &linenum);    break;   case 2:   //删除指定的字符串    printf("要删除的字符串:");    scanf("%s", str);    number = findstr(str);    if (number == NOT_FOUND)     printf("没有找到");    else     deletestr(lnum, number, strlen(str));    break;   case 3:  //退出删除    break;   }   break;  case 3:   //执行显示功能   choice = menu_select_print(); //显示子菜单   switch (choice)  //显示指定行   {   case 1:    printf("\t行号:");    scanf("%d", &linenum);    printline(linenum);    break;   case 2:  //显示全部    list();    break;   case 3:  //退出显示    break;   }   break;  case 4:   //执行查找功能   printf("输入想要查找的字符串:");   scanf("%s", str);   number = findstr(str);   if (number == NOT_FOUND)    printf("没有找到");   else    printf("要查找的字符串所在行号:%d,列号:%d\n", lnum, number + 1);   break;  case 5:  //执行替换功能   printf("输入被替换的字符串:");   scanf("%s", str);   number = findstr(str);   if (number == NOT_FOUND)    printf("没有找到");   else   {    deletestr(lnum, number, strlen(str));    printf("要替换的字符串:");    scanf("%s", str);    insert(str, lnum, number + 1);   }   break;   case 6:     //执行移动功能   choice = menu_select_move();   //移动子菜单   switch (choice)   {   case 1:   // 向下移动一行    printf("输人要移动的字符串所在行号:");    scanf("%d", &linenum);    enter_empty(linenum);    break;   case 2:   //向上移动一行    printf("输入要移动的字符串所在行号:");    scanf("%d", &linenum);    delete_text(linenum - 1);    break;   case 3:   //向右移动一列    printf("输人要移动的字符串所在行号:");    scanf("%d", &linenum);    printf("输入要移动的字符串所在列号:");    scanf("%d", &number);    str[0] = ' ';    str[1] = '\0';    insert(str, linenum, number);    break;   case 4:   //向左移动    printf("输入要移动的字符串所在行号:");    scanf("%d", &linenum);    printf("输入要移动的字符串所在列号:");    scanf("%d", &number);    if (number <= 0)     printf("该列不存在");    else     deletestr(linenum, number - 2, 1);    break;   case 5:   //退出移动    break;   }   break;  case 7:  //执行存盘功能   save();   break;  case 8:  //执行读入文件功能   load();   break;  case 9:  //执行退出功能   exit(0);   break;  } } while (1); return 0;}//下列函数是主菜单功能的提示界面,其功能是说明主菜单中选项int menu_select(){ int c; printf("\n\t\t1.插入\n"); printf("\t\t2.删除\n"); printf("\t\t3.显示\n"); printf("\t\t4.查找\n"); printf("\t\t5.替换\n"); printf("\t\t6.移动\n"); printf("\t\t7.文件存盘\n"); printf("\t\t8.装入文件\n"); printf("\t\t9.退出\n"); do {  printf("\n\n\t\t请按数字选择:");  scanf("%d", &c); } while (!(c >= 1 && c <= 9)); return(c);} //下列函数是插入子菜单功能的提示界面,其功能是说明在插入菜单下选项的含义。int menu_select_insert(){ int c; printf("\n\t\t1.插入一行文字\n"); printf("\t\t2.插入一段文字\n"); printf("\t\t3.返回上级菜单\n"); do{  printf("\n\n\t\t请按数字选择:");  scanf("%d", &c); } while (!(c >= 1 && c <= 3)); return(c);}//下列函数是删除子菜单功能的提示界面,其功能是说明在删除子菜单下选项的含义。int menu_select_delete(){ int c; printf("\n\t\t1.删除一行文字\n"); printf("\t\t2.删除一段文字\n"); printf("\t\t3.返回上级菜单\n"); do{  printf("\n\n\t\t请按数字选择:");  scanf("%d", &c); } while (!(c >= 1 && c <= 3)); return(c);}//下列函数是显示子菜单功能的提示界面,其功能是说明在显示子菜单下选项的含义int menu_select_print(){ int c; printf("\n\t\t1.显示一行\n"); printf("\t\t2.全部显示\n"); printf("\t\t3.返回上级菜单\n"); do{  printf("\n\n\t\t请按数字选择:");  scanf("%d", &c); }while(!(c >= 1 && c <= 3)); return(c);}//下列函数是移动子菜单功能的提示界面,其功能是说明在移动子菜单下选项的含义int menu_select_move(){ int c; printf("\n\t\t1.向下移动一行\n"); printf("\t\t2.向上移动一行\n"); printf("\t\t3.向右移动一列\n"); printf("\t\t4.向左移动一列\n"); printf("\t\t5.返回上级菜单\n"); do{  printf("\n\n\t\t请按数字选择:");  scanf("%d", &c); } while (!(c >= 1 && c <= 5)); return(c);}//下列函数的功能是在指定的行号 linenum处插入一行文字。void enter(int linenum){ struct line * info, * q, * p; p = start; q = NULL; while (p && p->num != linenum) //找到插入行 {  q = p;  p = p->next; } if (p == NULL && (q->num + 1) != linenum) //指定行不存在,不能插入 {  printf("输入的行号不存在"); } else // 指定行存在,进行插入 {  info = (struct line *)malloc(sizeof(struct line));  printf("输入要输入的字符串");  scanf("%s", info->text);  info->num = linenum;  if (linenum == 1)  //插入在第一行  {   info->next = p;   p->prior = info;   info->prior = NULL;   start = info;  }  else if (q->num != linenum)  //插入在最后一行  {   q->next = info;   info->next = p;   info->prior = q;  }  else     //插入在其他行  {   q->next = info;   info->next = p;   p->prior = info;   info->prior = q;  }  while (p)   //如果不是插入在最后一行,插入行后面的行号都加1  {   p->num = p->num + 1;   p = p->next;  } }} //下列函数是为其他功能提供的一个辅助函数,它的功能是当文本内容插在文件中间时//其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必减1.void patchup(int n, int incr){ struct line *i; i = find(n); i = i->next; while (i) {  i->num = i->num + incr;  i = i->next; }}//下列函数的功能是在指定行处插入一个空白行。void enter_empty(int linenum){ struct line *info, *p; info = (struct line *)malloc(sizeof(struct line)); if (!info) {  printf("\t!内存不够!\n");  exit(0); } info->text[0] = ' '; info->text[1] = '\0'; info->num = linenum; if (find(linenum))    //如果要插人的行号存在,则进行插入 {  p = start;  if (linenum == 1)    //插入在首行  {   info->next = p;   start = info;   info->prior = NULL;   p->prior = info;  }  else  //插入在其他行  {   while (p->next->num != linenum)    p = p->next;   info->next = p->next;   p->next->prior = info;   p->next = info;   info->prior = p;  }  patchup(linenum, 1); } else  printf("该行不存在");} //下列函数的功能是插入文字到一行的中间。要是插入位置和现有位置中间有间隔,会补全空格void insert(char str[], int linenum, int position){ struct line * info; int len, i; int lenth; char rest_str[MAX_LEN], nostr[2] = { " " }; info = start; while (info && info->num != linenum)   //查询要插入的行 {  info = info->next; } if (info == NULL)  printf("不存在该行!\n"); else if (position < 0)  printf("不存在该列!\n"); else    //如果行和列都存在,则进行插入 {  lenth = strlen(info->text);  if (lenth < position) //插入列大于本行文件列数  {   len = position - lenth - 1;   for (i = 0; i < len; i++)    strcat(info->text, nostr);   //将空余的部分插入空格符   strcat(info->text, str);    //插入字符到列的未尾  }  else   //插入列在本行文字的中间  {   strcpy(rest_str, &info->text[position - 1]);   strcpy(&info->text[position - 1], str);   strcat(info->text, rest_str);  } }} //下列函数的功能是删除指定行、指定位置、长度为 lenth的一段文字。void deletestr(int linenum, int position, int lenth){ struct line * info; char rest_str[MAX_LEN]; info = find(linenum); if (info == NULL)  printf("该行没有字符!n"); else {  if (strlen(info->text) <= (position + lenth))  //本行的字符长度<=待删除的列号+删除长度,直接在当前位置插入'\0'   info->text[position] = '\0';  else  {   strcpy(rest_str, &info->text[position + lenth]);   strcpy(&info->text[position], rest_str);  } }}//下列函数的功能是删除指定行号 lineup的文字。void delete_text(int linenum){ struct line * info, *p; info = start; while ((info->num < linenum) && info)  info = info->next; if (info->next == NULL)  printf("该行不存在"); else {  p = info->next;  if (start == info) //如果删除的是第一行  {   start = info->next;   if (start)  //如果删除后,不为空    start->prior = NULL;   else  //删除后为空    last = NULL;  }  else  {   info->prior->next = info->next;  //指定行的上一行指向指定行的下一行   if (info != last) //如果不是最后一行    info->next->prior = info->prior;  //修改其下一行的指向头的指针    else  //如果是最后一行,修改尾指针    last = info->prior;  }  free(info);  while (p)  {   p->num = p->num - 1;   p = p->next;  } }}//下列函数的功能是查找一段文字。int findstr(char * to_find){ struct line * info; int i = 0, find_len, found = 0, position; char substring[MAX_LEN]; info = start; lnum = 0;  //匹配到的行号 find_len = strlen(to_find); while (info && !found)   //查询 {  i = 0;  //行间循环  while (!found && (i <= strlen(info->text) - find_len))  //行内查找循环  {   strcpy(substring, &info->text[i], find_len);   substring[find_len] = '\0';   if (strcmp(substring, to_find) == 0)   {    found = 1;    lnum = info->num;   }   else    ++i;  }  info = info->next; } if (found)  //查找成功  position = i; else   //查找不成功  position = NOT_FOUND; return(position);}//下列函数的功能是查找指定行,如果查找成功返回结点所在的行指针。struct line * find(int linenum){ struct line * info; info = start; while (info) {  if (linenum != info->num)   info = info->next;  else   break; } return (info);} //下列函数的功能是显示指定行void printline(int linenum){ struct line *info; info = find(linenum); if (info)  printf("%d:%s\n", info->num, info->text); else  printf("该行不存在");}//下列函数的功能是显示线性表中的所有文本void list(){ struct line * info; info = start; while (info) {  printf("%d:%s\n", info->num, info->text);  info = info->next; } printf("\n\n");}//下列函数的功能是把线性表中的所有文字保存到文件中void save(){ struct line * info; char * p; FILE * fp; if ((fp = fopen("D:\\text.txt", "w")) == NULL){  printf("\t文件打不开!n");  exit(0); } printf("\t正在存入文件!\n"); info = start; while (info) {  p = info->text;  while (*p)   putc(*p++, fp);  putc('\n', fp);  info = info->next; } fclose(fp);}//下列函数的功能是把文本文件中的内容读入到线性表中。void load(){ struct line *info, *temp;  //info指向当前行,temp指向info的前驱行 char c; FILE *fp;  //文件指针 int inct, i;  //行计数器 temp = NULL; if ((fp = fopen("D:\\text.txt", "r")) == NULL) {  printf("\t文件打不开!\n");  exit(0); } printf("\n\t正装入文件!\n"); start = (struct line*)malloc(sizeof(struct line)); //动态生成一行的结点空间 info = start; inct = 1; while ((c = fgetc(fp)) != EOF) {  i = 0;  info->text[i] = c;  i++;  while ((c = fgetc(fp)) != '\n')  //从文件中读取一行字符到线性表中,文件中每一行以\n为结束标  {   info->text[i] = c;   i++;  }  info->text[i] = '\0';  //线性表中每行末尾的结束标志  info->num = inct++;  //行号和计数器都加1  info->next = (struct line*)malloc(sizeof(struct line));  if (!info->next)  {   printf("\n\t内存已经用完!");   exit(0);  }  info->prior = temp;  temp = info;  info = info->next; } temp->next = NULL; last = temp; free(info); start->prior = NULL; fclose(fp);}

感谢你能够认真阅读完这篇文章,希望小编分享的“C语言如何实现简易文本编辑器”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言如何实现简易文本编辑器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言如何实现简易文本编辑器

这篇文章主要介绍了C语言如何实现简易文本编辑器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,
2023-06-15

C语言如何实现简易文本编译器

这篇文章将为大家详细讲解有关C语言如何实现简易文本编译器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易
2023-06-15

C语言如何实现简单的文本编辑器

这篇文章将为大家详细讲解有关C语言如何实现简单的文本编辑器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下预期实现三个功能,第一,可以对指定的行输入字符串;第二,删除指定行的字符串;第三,显示编
2023-06-15

C语言如何实现简易版三子棋

这篇文章给大家分享的是有关C语言如何实现简易版三子棋的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言test.c 放游戏的测试逻辑——调用game.c game.h游戏模块:game.c 放游戏的实现逻辑
2023-06-21

C语言如何实现简易扫雷游戏

这篇文章主要介绍C语言如何实现简易扫雷游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下一、想要达到的游戏功能:大家如果想编写一个游戏,应具备以下的步骤:1:了解游戏的规则2: 知道游戏应该实现哪些功
2023-06-20

java如何实现文本编辑器

要实现一个文本编辑器,你可以使用Java的图形用户界面(GUI)库,例如Swing或JavaFX。首先,创建一个主要的窗口,可以使用JFrame类(Swing)或Stage类(JavaFX)。在窗口中,你可以添加菜单栏和工具栏,以及一个文本
2023-09-06

C语言如何实现简易的扫雷游戏

这篇文章给大家分享的是有关C语言如何实现简易的扫雷游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下在正式讲内容之前先说一说扫雷游戏的规则游戏规则很简单,点击方格,如果是地雷,游戏失败,找到所有地雷游
2023-06-25

Qt如何实现多文本编辑器

本篇内容主要讲解“Qt如何实现多文本编辑器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt如何实现多文本编辑器”吧!首先先来看实验成果图,大概就是这么个多文档编辑器。首先需要在设计模式里进行设
2023-07-05

如何使用C语言实现简易扫雷游戏

这篇文章主要介绍了如何使用C语言实现简易扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、头文件#define _CRT_SECURE_NO_WARNINGS//包含
2023-06-26

C语言如何实现简易学生管理系统

本篇内容主要讲解“C语言如何实现简易学生管理系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现简易学生管理系统”吧!首先我们在做一个管理系统之前要了解这个学生管理系统需要哪些功能,
2023-07-02

如何用C语言实现简易三子棋游戏

今天小编给大家分享一下如何用C语言实现简易三子棋游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、头文件#define
2023-06-26

怎么用C语言脚本实现简易通讯录

这篇文章主要介绍“怎么用C语言脚本实现简易通讯录”,在日常操作中,相信很多人在怎么用C语言脚本实现简易通讯录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言脚本实现简易通讯录”的疑惑有所帮助!接下来
2023-06-29

基于C语言如何实现简易的扫雷游戏

这篇文章主要讲解了“基于C语言如何实现简易的扫雷游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于C语言如何实现简易的扫雷游戏”吧!扫雷即在一个棋盘中,随机放入一定数量的雷,玩家通过输入
2023-06-30

C语言代码如何实现简易三子棋游戏

小编给大家分享一下C语言代码如何实现简易三子棋游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录