Как я могу изменить Strcpy и strcat для sprintf - PullRequest
0 голосов
/ 29 марта 2012

Я новичок в 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

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Первый вопрос, работает ли этот код?

Да, но проще:

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

Второй вопрос: абсолютно не существует способа, которымout и in variable может быть числовым, и что мне нужно будет использовать% d вместо% s, верно?

Нет - strcpy и strcat работают только со строковым содержимым.

переменные out и in будут отличаться на каждой итерации метода во всем коде, который я хочу изменить, поэтому модификация должна быть гибкой для имен переменных.Как я могу это сделать?Это проект VisualStudio 98 ... Но я нахожусь на Linux Ubuntu и Windows XP.

Это сложно ... может использовать подстановки регулярных выражений, но может привести к сбою для действительно странного кода.Вы также можете попробовать использовать препроцессор и определение хеш-кода, но вы хотите отключить включение расширения, все дополнительные символы, которые препроцессор обычно создает молча ... которые могут поддерживаться или не поддерживаться переключателями командной строки вашего препроцессора..

Сколько экземпляров вы должны изменить?Если не слишком много, можно попробовать регулярное выражение и вручную просмотреть ....

0 голосов
/ 29 марта 2012

Не ясно, почему вы хотите это сделать ...

Но как бы то ни было, от первого взгляда на это сработает; второму не нужно делать do {} while (0) вокруг него - вместо этого вы можете просто использовать {}, чтобы сохранить локальность tmp. Но похоже, что это будет работать. Или вы можете использовать

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

и избавь себя от беспокойства.

Но моя главная проблема с любым из этих методов - вы не проверяете переполнение буфера. Что, если out недостаточно велик, чтобы удержать результат? Конечно, это может произойти в исходном коде, поэтому, возможно, его проверяют.

...