0%

strcpy函数实现

strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//实现1
char * strcpy(char* _Dest, const char* _Source)
{
//检查传入参数的有效性
assert(NULL != _Dest);
assert(NULL != _Source);
if (NULL ==_Dest || NULL == _Source)
return NULL;
char* ret = _Dest;
while((*_Dest++ = *_Source++) != '\0') ;
return ret;
}

//实现2
char * strcpy(char* _Dest, const char* _Source)
{
//检查传入参数的有效性
assert(NULL != _Dest);
assert(NULL != _Source);
if (NULL ==_Dest || NULL == _Source)
return NULL;
char* ret = _Dest;
int i = 0;
for (i = 0; _Source[i] != '\0'; i++)
{
_Dest[i] = _Source[i];
}
_Dest[i] = '\0';
return ret;
}

解析:

1. 为什么要返回char*类型;

为了实现链式连接。返回内容为指向目标内存的地址指针,这样可以在需要字符指针的函数中使用strcpy,例如strlen(strcpy(str1, str2))。

2. 源地址和目标地址出现内存重叠时,如何保证复制的正确性;

调用c运行库strcpy函数,发现即使是内存重叠,也能正常复制,但是上面的实现就不行。说明,c运行库中strcpy函数实现,还加入了检查内存重叠的机制,下面是参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//my_memcpy实现重叠内存转移
char* my_memcpy(char* _Dest, const char* _Source, int count)
{
//检查传入参数的有效性
assert(NULL != _Dest);
assert(NULL != _Source);
if (NULL ==_Dest || NULL == _Source)
return NULL;
char* ret = _Dest;
/**
_Dest和_Source的内存地址有三种排列组合:
1. _Dest和_Source没有发生重叠;
2. _Dest的地址大于_Source的地址;
3. _Dest的地址小于_Source的地址;
第一种情况和第三种情况,直接从低位字节开始复制,即可;
第二种情况,必须从高位字节开始复制,才能保证复制正确。
*/
if (_Dest > _Source && _Dest < _Source + count - 1)
{
_Dest = _Dest + count - 1;
_Source = _Source + count - 1;
while(count--)
{
*_Dest-- = *_Source--;
}
}else
{
while(count--)
{
*_Dest++ = *_Source++;
}
}
return ret;
}

strcpy和memcpy的区别

strcpy和memcpy都是标准C库函数。

  1. strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广;
  2. strcpy只有两个参数,即遇到‘\0’结束复制,而memcpy是根据第三个参数来决定复制的长度。

使用PowerDesigner对NAME和COMMENT互相转换

在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中写中文,在Code中写英文。Name用来显 示,Code在代码中使用,但Comment中的文字会保存到数据库Table或Column的Comment中,当Name已经存在的时候,再写一次 Comment很麻烦,可以使用以下代码来解决这个问题。

在PowerDesigner中使用方法为:
PowerDesigner->Tools->Execute Commands->Edit/Run Scripts
将代码Copy进去执行就可以了,是对整个CDM或PDM进行操作

代码一:将Name中的字符COPY至Comment中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Option   Explicit 
ValidationMode = True
InteractiveMode = im_Batch

Dim mdl ' the current model

' get the current active model
Set mdl = ActiveModel
If (mdl Is Nothing) Then
MsgBox "There is no current Model "
ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model. "
Else
ProcessFolder mdl
End If

' This routine copy name into comment for each table, each column and each view
' of the current folder
Private sub ProcessFolder(folder)
Dim Tab 'running table
for each Tab in folder.tables
if not tab.isShortcut then
tab.comment = tab.name
Dim col ' running column
for each col in tab.columns
col.comment= col.name
next
end if
next

Dim view 'running view
for each view in folder.Views
if not view.isShortcut then
view.comment = view.name
end if
next

' go into the sub-packages
Dim f ' running folder
For Each f In folder.Packages
if not f.IsShortcut then
ProcessFolder f
end if
Next
end sub

另外在使用REVERSE ENGINEER从数据库反向生成PDM的时候,PDM中的表的NAME和CODE事实上都是CODE,为了把NAME替换为数据库中Table或Column的中文Comment,可以使用以下脚本:

代码二:将Comment中的字符COPY至Name中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Option   Explicit 
ValidationMode = True
InteractiveMode = im_Batch

Dim mdl ' the current model

' get the current active model
Set mdl = ActiveModel
If (mdl Is Nothing) Then
MsgBox "There is no current Model "
ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model. "
Else
ProcessFolder mdl
End If

Private sub ProcessFolder(folder)
On Error Resume Next
Dim Tab 'running table
for each Tab in folder.tables
if not tab.isShortcut then
tab.name = tab.comment
Dim col ' running column
for each col in tab.columns
if col.comment="" then
else
col.name= col.comment
end if
next
end if
next

Dim view 'running view
for each view in folder.Views
if not view.isShortcut then
view.name = view.comment
end if
next

' go into the sub-packages
Dim f ' running folder
For Each f In folder.Packages
if not f.IsShortcut then
ProcessFolder f
end if
Next
end sub

本文转载自CSDN芸芸众生无名之辈

众所周知,Office VOL版本可以连接KMS服务器激活,但是office2019没有镜像可以下载,所以只能依靠Office Deployment Tool来进行操作。注:Office2019 Retail零售版有官方镜像可以下载。

下载旧版本的Office

office官方卸载工具

下载工具

  1. 去官网下载Office Deployment Tool (ODT)
  2. 下载完成之后运行,执行后,会输出4个文件
  3. 输出的文件,只要是 *.xml 文件都可以删除,留下setup.exe文件

创建配置文件

在线配置xml文件点这里,根据提示操作,完成后点击【导出】,最终会下载一个XML文件。每个人的选择不同,得出来的configuration.xml,以下是笔者的configuration.xml,以供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Configuration ID="87024f0a-c3dc-4626-b8d5-32cbdef9375d">
<Add OfficeClientEdition="64" Channel="PerpetualVL2019" ForceUpgrade="TRUE">
<Product ID="ProPlus2019Volume">
<Language ID="zh-cn" />
<Language ID="en-us" />
</Product>
<Product ID="VisioPro2019Volume">
<Language ID="zh-cn" />
<Language ID="en-us" />
</Product>
<Product ID="ProjectPro2019Volume">
<Language ID="zh-cn" />
<Language ID="en-us" />
</Product>
</Add>
<Property Name="SharedComputerLicensing" Value="0" />
<Property Name="PinIconsToTaskbar" Value="TRUE" />
<Property Name="SCLCacheOverride" Value="0" />
<Updates Enabled="TRUE" />
<RemoveMSI All="TRUE" />
</Configuration>

下载&安装

setup.exe文件和configuration.xml两个文件放在同一个文件夹下

打开命令提示符,用管理员权限运行

1
setup /download configuration.xml

默默等待下载完成,完成之后命令行就继续输入

1
setup /configure configuration.xml

激活

随便打开一个 Office 输入 Gvlk ,详情参考
随后使用管理员身份执行命令提示符

1
2
3
4
cd /d "%ProgramFiles%\Microsoft Office\Office16" #进入office的安装目录,目录可通过开始菜单或桌面的快捷方式,右键,“打开文件所在位置”,找到。
cscript ospp.vbs /sethst:kms.address.org #设置KMS服务器
cscript ospp.vbs /act #立即激活
cscript ospp.vbs /dstatus #查看激活状态

kms.address.org 替换成真正的KMS服务器即可

微软官方安装视频教程

微软帮助与支持:Office 2019 部署安装指南

Hello World!

物语系列