我是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
答案 0 :(得分:0)
不清楚你为什么要这样做......
但是,尽管如此,从第一个看起来可行;第二个不需要do {} while(0)围绕它 - 你可以只使用{}来保持tmp local。但看起来它会起作用。或者你可以使用
sprintf( out, "%s%s", in );
并省去了麻烦。
但我对这些方法的主要关注是你没有检查缓冲区溢出。如果输出不足以保持结果怎么办?当然,这可能发生在原始代码中,因此可能正在检查。
答案 1 :(得分:0)
第一个问题,该代码是否有效?
是的,但更简单:
strcat(out, in) -> sprintf(out + strlen(out), in)
第二个问题,out和in变量绝对没有办法数字化,我需要使用%d而不是%s,对吗?
否 - strcpy
和strcat
仅适用于字符串内容。
out和in变量在我想要修改的所有代码中的方法的每次迭代中都是不同的,因此修改必须对变量名称是灵活的。我能以任何方式做到吗?这是一个VisualStudio 98项目......但我在Linux上使用ubuntu和Windows XP。
这很棘手......可以使用regexp替换,但它可能会因为真正奇怪的代码而失败。您也可以尝试使用预处理器和散列定义,但是您要禁用包含扩展,预处理器通常默默创建的所有额外符号...命令行切换到预处理器可能支持也可能不支持
您需要更改多少个实例?如果不是太多,可以尝试regexp并手动审查......