-1

我是 C++ 新手,我必须对一个大项目进行反复修改。我必须采用所有 strcpy 和 strcat 方法并将它们转换为 sprintf。我发现基本上,转换将是:

strcpy(out,in) to sprintf(out, "%s", in)

strcat(out,in) to do{ int temp = strlen(out); sprintf(out+temp, "%s", in); } while(0)

第一个问题,该代码有效吗?

第二个问题,out 和 in 变量绝对不可能是数字的,我需要使用 %d 而不是 %s,对吗?

第三个问题,在我要修改的所有代码中,方法的每次迭代中的 out 和 in 变量都会有所不同,因此修改必须对变量名称灵活。我有什么办法可以做到吗?这是一个 VisualStudio 98 项目......但我在 linux ubuntu 和 windows XP 上。

感谢您的时间和建议!

哦,别担心我备份了我的文件:D

4

2 回答 2

0

不清楚你为什么要这样做......

但是,尽管如此,从外观上看,第一个有效;第二个不需要 do { } while(0) 围绕它 - 你可以只使用 {} 来保持 tmp 本地。但看起来它会起作用。或者你可以使用

sprintf( out, "%s%s", in ); 

并省去麻烦。

但我对这些方法中的任何一个的主要担心是您没有检查缓冲区溢出。如果 out 不足以容纳结果怎么办?当然,这可能发生在原始代码中,所以可能正在检查中。

于 2012-03-29T15:28:29.117 回答
0

第一个问题,该代码有效吗?

是的,但更简单:

strcat(out, in) -> sprintf(out + strlen(out), in)

第二个问题,out 和 in 变量绝对不可能是数字的,我需要使用 %d 而不是 %s,对吗?

否 -strcpystrcat适用于字符串内容。

在我要修改的所有代码中,方法的每次迭代中的 out 和 in 变量都会有所不同,因此修改必须对变量名称灵活。我有什么办法可以做到吗?这是一个 VisualStudio 98 项目......但我在 linux ubuntu 和 windows XP 上。

这很棘手......可以使用正则表达式替换,但对于非常奇怪的代码它可能会失败。您也可以尝试使用预处理器和散列定义,但您想禁用包含扩展,预处理器通常静默创建的所有额外符号......这可能会或可能不会被命令行切换到您的预处理器.

您必须更改多少个实例?如果不是太多,可以尝试正则表达式并手动查看....

于 2012-03-29T15:30:25.647 回答