android的同学们一定都晓得,每个工程都有多种语言字符串。

当我们需要检测翻译是否完整的时候,一个个字符串对比效率太低,为此给出小工具源码如下:


meld_string.c

#include<stdio.h>#include<string.h>#define LINE_BUFFER_SIZE 300#define NAME_BUFFER_SIZE 100void get_string_name(char* line, char* name);int check_args(int argc, char** argv, char* ret);int compared_file_with_string(FILE* file, char* string_name);const char* string_line_head = "<string name=";const char* null = 0l;int main(int argc, char** argv){char* base_filename = NULL;char* compared_filename = NULL;char* result_filename = NULL;FILE *base_file;FILE *compared_file;FILE *result_file;char buffer[LINE_BUFFER_SIZE];char name[NAME_BUFFER_SIZE];int result = 0;//命令行输入参数检测if(argc <= 1){printf("\nPlease input files' name and retry!\n\n");return 0;}if(argc == 3){result_filename = "result";} else if(argc == 4){result_filename = argv[3];} else{printf("\nPlease input args as ./exc base_file_name compared_file_name [result_file_name] and retry!\n\n");return 0;}base_filename = argv[1];compared_filename = argv[2];//printf("base filename is: %s\n", base_filename);if((base_file = fopen(base_filename, "r")) == NULL){printf("open %s error!!\n", base_filename); return 0;}if((compared_file = fopen(compared_filename, "r")) == NULL){printf("open %s error!!\n", compared_filename); return 0;}if((result_file = fopen(result_filename, "w+")) == NULL){printf("open %s error!!\n", result_filename); return 0;}while(!feof(base_file)){buffer[0] = '\0';fgets(buffer, sizeof(buffer), base_file);//printf("read line: %s", buffer);if(0 == line_with_string_line_head(buffer)){get_string_name(buffer, name);//printf("---------base file name = %s\n", name);result = compared_file_with_string(compared_file, name);if(result == 0){//对比文件中也包含这个字符串} else{//对比文件中不包含这个字符串//printf("%s\n", buffer);fputs(buffer, result_file);}rewind(compared_file);}}fclose(base_file);fclose(compared_file);fclose(result_file);printf("\nCompleted and printed to file named \"%s\" !!!\n\n", result_filename);return 0;}/**  * 命令行输入参数检测   * 返回0:参数合法  * 返回其他:不合法  **/int check_args(int argc, char** argv, char *result){//printf("meld_string, the number of arguments == %d\n", argc);return 0;}/**  * 获得字符串的名字  **/void get_string_name(char* line, char* name){char* h = line;char *start = NULL, *end = NULL;int length = 0;while(*(h) != '\0'){if(*h == '\"'){if(start == NULL){start = h + 1;} else if(end == NULL){end = h - 1;break;}}h++;}if(start != NULL && end != NULL){length = (int)(end - start) + 1;strncpy(name, start, length);name[length] = '\0'; //very importent} else{return;}}/**  * 判断当前行是否含有"<string name="  * 如果含有则返回0  **/int line_with_string_line_head(const char* line){const char* start = line;int ret = -1;while(*(start) != '\0'){if(*start == '<'){ret = strncmp(start, string_line_head, 12);return ret;}start++;}return ret;}/**  * 判断要比较的文件是否有此字符串名字  * 返回 0:有此name  * 返回 其他:没有此name  **/int compared_file_with_string(FILE* file, char* string_name){char buffer[LINE_BUFFER_SIZE];char name[NAME_BUFFER_SIZE];int ret = -1;while(!feof(file)){buffer[0] = '\0';fgets(buffer, sizeof(buffer), file);//printf("read line: %s", buffer);if(0 == line_with_string_line_head(buffer)){get_string_name(buffer, name);//printf("compared file name = %s\n", name);ret = strcmp(string_name, name);//printf("compare ret = %d\n", ret);if(ret == 0) return ret;}}return ret;}

复制代码内容到meld_string.c

当然文件名也可以为其他。

之后命令行执行 gcc meld_string.c

会生成a.out可执行文件

命令行执行a.out base_file_name compared_file_name result_file_name

或者a.out base_file_name compared_file_name

就会在指定路径下生成对应的对比结果文件。


注释:

其中,base_file_name: 我们认为完整的字符串文件(android工程里的string.xml)

compared_file_name:跟base_file_name相比的文件(也是android工程里的string.xml)

result_file_name:指定生成比较结果(即base_file_name中含有,但是compared_file_name中不含有的字符串们)的文件名

在不指定的情况下,默认文件名为result.



更多相关文章

  1. Android(安卓)Too many classes in --main-dex-list 错误原因及A
  2. android开机动画
  3. android注意事项。随时补充
  4. Android中使用PULL方式解析XML文件深入介绍
  5. Android事件分发机制
  6. Android(安卓)技术专题系列之五 -- 本地化
  7. android 打开预览不同类型文件
  8. Android使用文件管理器打开指定文件夹,浏览里面的内容
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)Jetpack - Lifecycles 介绍
  2. android 常用的开发工具
  3. Android(安卓)控件备用收集
  4. Android开发之API应用指南
  5. Phonegap获取imei (修改phonegap官方提供
  6. Android学习:LogCat日志查询
  7. 简易版的 Spring 之如何实现 Setter 注入
  8. Android中的四大组件
  9. Android(安卓)补间动画 --旋转
  10. Android中sqlite事物控制