问题描述
有多个带后缀的用分号分隔的文件名(形如:1.xml;2.pdf;3.jpg;4.txt),编写C程序用于将满足后缀要求的第一个文件名找出来,并显示文件的类型。
规定的后缀及文件类型对应如下:
语音:类型1,后缀wav;
视频:类型2,后缀3gp;
传真:类型3,后缀tif;
图片:类型4,后缀jpg;
文本:类型5,后缀txt。
对于“1.xml;2.pdf;3.jpg;4.txt”,程序需输出文件名“3.jpg”和类型“4”。即“3.jpg”是满足后缀要求的第一个文件名,该文件的类型是“4”(图片)。
C程序实现
/********************************************************************** * 版权所有 (C)2014, ZhouZhaoxiong。 * * 文件名称: SuffixTest.c * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本: V1.0 * 作 者:周兆熊 * 完成日期: 20141106 * * 修改记录1: * 修改日期: 20141106 * 版本号: V1.0 * 修改人: Zhou Zhaoxiong * 修改内容:创建 **********************************************************************/ #include #include // 数据类型 typedef signed char INT8; typedef unsigned char UINT16; typedef unsigned int UINT32; typedef signed int INT32; #defineMAX_FILESUFFIX_LEN 6 // 文件后缀单个最大长度 #defineMAX_FILESUFFIX_NUM 6 // 文件后缀最大个数 // 函数声明 INT32 ParseMsgContent(INT8 *pContent, INT8 *pFileName, INT32 *piFileType); // 该函数用于解析传入的内容,获取文件名和文件类型 void GetFileSuffix(INT8 *pFileName, INT8 *pSuffix); // 该函数用户获取文件后缀 INT32 GetFileType(INT8*pSuffix, INT32 *piFileType); // 该函数用于获取文件类型 INT32 main(void); /**************************************************************** * 功能描述: 主函数 * 输入参数: 无 * 输出参数: 无 * 返回值: 0-执行成功 -1-执行失败 * 其他说明: 无 * 修改日期 版本号 修改人 修改内容 *-------------------------------------------------------------- * 20141106 V1.0 Zhou Zhaoxiong 创建 ****************************************************************/ INT32 main(void) { INT32 iRetValue = 0; INT8 szMsgContent[512] = {0}; INT8 szFirstFileName[100] = {0}; // 第一个文件名, 形如: 1.jpg INT32 iFileType = 0; // 文件类型 memcpy(szMsgContent, "1.xml;2.pdf;3.jpg;4.txt",strlen("1.xml;2.pdf;3.jpg;4.txt")); // 调用函数解析第一个满足后缀要求的文件名, 并打印出来 iRetValue = ParseMsgContent(szMsgContent,szFirstFileName, &iFileType); if (iRetValue != 0) { printf("exec ParseMsgContentfailed.\n"); return -1; } printf("MsgContent=%s, FirstFileName=%s,FileType=%d\n", szMsgContent, szFirstFileName, iFileType); return 0; } /********************************************************************** * 功能描述:解析消息内容 * 输入参数: pMsgContent-消息内容 * 输出参数: pFileName-文件名 piFileType-文件类型 * 返回值: 0-成功 其他-失败 * 其它说明:消息字段之间用分号(;)分隔 * 修改日期 版本号 修改人 修改内容 *--------------------------------------------------------------------- * 20141106 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32ParseMsgContent(INT8 *pMsgContent, INT8 *pFileName, INT32 *piFileType) { INT8 szMsgContent[512] = {0}; INT8 szFileName[50+1] = {0}; INT8 szSuffix[MAX_FILESUFFIX_LEN+1] ={0}; INT8 *pEndStr = NULL; INT8 *pBeginStr = NULL; INT8 *pSuffix = NULL; INT32 iLen = 0; INT8 szField[10][50+1] = {0}; INT32 iFieldLen = 0; INT32 iFlag = 0; INT32 iLoopFlag = 0; INT32 iRetValue = 0; if( pMsgContent == NULL || pFileName == NULL || piFileType ==NULL ) { printf("ParseMsgContent(...):input parameter(s) is NULL.\n"); return -1; } memcpy(szMsgContent, pMsgContent, sizeof(szMsgContent)-1); printf("ParseMsgContent(...): whole content=%s.\n",szMsgContent); iLen = strlen(szMsgContent); if (szMsgContent[iLen-1] != ';') { strcat(szMsgContent,";"); } pBeginStr = szMsgContent; // 首先将整个content字段解析出来, 只解析前10个字段 while((pEndStr = strchr(pBeginStr, ';')) != NULL) { if((pEndStr - pBeginStr) >= 50) { iFieldLen = 50; } else { iFieldLen = pEndStr - pBeginStr; } strncpy(szField[iFlag], pBeginStr, iFieldLen); pBeginStr = pEndStr + 1; iFlag ++; if (iFlag >= 10) { break; } } // 开始判断文件类型, 只取符合后缀要求的第一个文件, 最多有10个文件 *piFileType = 0; for (iFlag = 0; iFlag =MAX_FILESUFFIX_LEN)) { iFieldLen = MAX_FILESUFFIX_LEN; } else { iFieldLen = strlen(pFileName) - (pStr + 1 - pFileName); } strncpy(pSuffix, pStr + 1, iFieldLen); return; } /********************************************************************** * 功能描述:获取文件类型 * 输入参数: pSuffix-文件后缀 piFileType-文件类型 * 输出参数:无 * 返回值: 0-成功其他-失败 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 *------------------------------------------------------------------------------------------------------- * 20141106 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 GetFileType(INT8*pSuffix, INT32 *piFileType) { INT8 szSuffix[10] ={0}; INT32 iFlag = 0; if (pSuffix == NULL || piFileType == NULL) { printf("GetFileType(...): inputparameter(s) is NULL.\n"); return -1; } strncpy(szSuffix, pSuffix, sizeof(szSuffix)-1); *piFileType = 0; for (iFlag = 0; iFlag
程序输出结果
可见,程序将满足后缀要求的第一个文件名“3.jpg”找了出来,该文件的类型是“4”(图片)。
(原文链接:http://www.zhouzhaoxiong.com/258.html)
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)