sprintf против strcat для добавления строки - PullRequest
1 голос
/ 27 июня 2019

У меня есть следующая строка:

  sprintf(someString,"%s%s",someString,someOtherString);

Компилятор выдает мне следующее предупреждение:

//someFile.c:277:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]

Я хочу заменить строку чем-то, что не даст мне ошибки компиляции. Я погуглил ошибку и узнал об ограниченных указателях, и это было мое решение:

strcat(someString, someOtherString);

Обеспечивает ли это ту же функциональность? Это происходит в моем тестировании, но я не хочу нарушать функциональность кода с некоторыми крайними случаями.

Ответы [ 2 ]

4 голосов
/ 28 июня 2019

Вы должны использовать strcat с достаточно большим целевым массивом.

Использование sprintf с тем же массивом, что и у целевого и строкового аргумента для %s, имеет неопределенное поведение.Большинство существующих реализаций будут давать ожидаемый результат для конкретного случая в вопросе, но стандарт C делает его явно неопределенным.

Компилятор по праву жалуется с предупреждением, которое может быть трудно расшифровать:

passing argument 1 to restrict-qualified parameter aliases with argument 3

Это означает, что аргумент 3 перекрывается с массивом, на который указывает аргумент 1, что неверно, если массив, на который указывает аргумент 3, разыменовывается, потому что он будет псевдонимом памяти, разыменованным через аргумент 1, который объявленкак restrict указатель в прототипе sprintf, подразумевая, что никакой другой указатель не должен читать или записывать память, к которой осуществляется доступ через него.

Угловой регистр, такой как sprintf(someString, "%.0s%s", someString, someOtherString);, имеет определенное поведение, если подходит someOtherStringв someString, поскольку аргумент 3 не разыменовывается, но компилятор может по-прежнему выдавать предупреждение.

3 голосов
/ 27 июня 2019

Использование sprintf для печати в той же строке, что и один из источников, является неопределенным поведением.Вы можете sprintf напечатать в третью строку, но strcat будет в любом случае более производительным, так как не нужно анализировать строку формата и делать дополнительную копию.В обоих случаях вам необходимо убедиться, что в someString достаточно места для содержимого someOtherString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...