#include <stdio.h>
#define U8 unsigned char
#define U16 unsigned short
/*
功能:将长度为len的key对应的字符串value从src中截取出来
MaxSize value前面字符的最大个数,包括=
src 原字符串,key=value,例如从文件中读取过来的数据
key 属性名称
len key的长度
value 存储得到的结果
1. 排除key前面的字符,从key开始算起,例如" abckey=value"
2. MaxSize是value前面字符的最大个数,包括=
3. value没有空格
*/
U8 GetStr(U16 MaxSize,char* src ,char* key ,U8 len, char* value)
{
U16 i,j;
U8 getFlag;
U16 getAddr;
char tempStr[200];
for(i=0;i<MaxSize-len;i++)
{
getFlag=1;
for(j=0;j<len;j++)
{
if(src[i+j]!=key[j])
{
getFlag=0;
break;
}
}
if(getFlag==1)
{
getAddr=i;
break;
}
}
if(getFlag==1)
{
sprintf(tempStr,"%s=%%s",key);// key=%s
sscanf(src+getAddr,tempStr,value);
}
return(getFlag);
}
int main()
{
char *src=" 1 2 abcd=12345 123";
char *key="abcd";
char val[200];
if(GetStr(10, src, "abcd", 4, val)==1)
{
printf("得到%s值为:%s\n", key, val);
}
return 0;
}
另外编译器原因,VS2010编译C程序时,要求变量声明在执行语句的前面,否者会报
error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
error C2065: “tempStr”: 未声明的标识符
编译器对变量声明的规定
C89在块(花括号)的开头声明所有局部变量,不是非要在函数开头。
C99以及C++中局部变量则没有这个限制,可在任何位置声明变量,只需放在使用之前的位置
据说,微软主要的方向是对C++的编译器提供新特性的支持(对C++11做了许多支持),而不是C编译器。
用7-Zip打开VS目录下的cl.exe,有一个version.txt打开内容如下:
FILEVERSION 16,0,30319,1
PRODUCTVERSION 10,0,30319,1
FILEFLAGSMASK 0x3F
FILEFLAGS 0x0
FILEOS VOS_UNKNOWN | VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0
{
BLOCK "StringFileInfo"
{
BLOCK "040904B0"
{
VALUE "CompanyName", "Microsoft Corporation"
VALUE "FileDescription", "Microsoft® C/C++ Compiler Driver"
VALUE "FileVersion", "16.00.30319.01 built by: RTMRel"
VALUE "InternalName", "CL.EXE"
VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved."
VALUE "OriginalFilename", "CL.EXE"
VALUE "ProductName", "Microsoft® Visual Studio® 2010"
VALUE "ProductVersion", "10.00.30319.01"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x409, 1200
}
}
这就是微软的封闭编译器吧。