Почему strcat () в новой строке вначале очищает неопределенные символы, в то время как strcpy в порядке? - PullRequest
0 голосов
/ 30 июля 2010

Например

sprintf(pos,"%f ",cl.snap.ps.origin[0]); //don't start with strcat
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);

отлично.

с

sprintf(tmp,"%f ",cl.snap.ps.origin[0]);strcat(pos, tmp);
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);

не отлично.

Ответы [ 3 ]

5 голосов
/ 30 июля 2010

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

Один из способов исправить это - инициализировать pos перед вашим кодом:

pos[0] = '\0';
sprintf(tmp,"%f ",cl.snap.ps.origin[0]);strcat(pos, tmp);
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
3 голосов
/ 30 июля 2010

strcat объединяет строки; Это означает, что он объединяет содержимое pos и tmp. Что содержит pos перед тем, как позвонить strcat? Это было определено?

1 голос
/ 30 июля 2010

Не используйте strcat и tmp.Вы пишете бессмысленно слишком сложный и неэффективный код.Вместо этого:

pos+=sprintf(pos,"%f ",cl.snap.ps.origin[0]);
pos+=sprintf(pos,"%f ",cl.snap.ps.origin[1]);
...

Если вы не уверены, что sprintf не может завершиться ошибкой, вместо непосредственного добавления возвращаемого значения к pos, вам, вероятно, следует сначала сохранить возвращаемое значение в отдельной переменной int ипроверьте, что это не -1. ​​

Было бы также лучше использовать snprintf, чтобы убедиться, что вы не переполняете свой буфер:

size_t cnt, rem=your_buffer_size;

cnt=snprintf(pos, rem,"%f ",cl.snap.ps.origin[0]);
if (cnt>=rem) goto error;
pos+=cnt; rem-=cnt;

cnt=snprintf(pos, rem,"%f ",cl.snap.ps.origin[1]);
if (cnt>=rem) goto error;
pos+=cnt; rem-=cnt;
...

Обратите внимание, что cnt являетсябеззнаковый тип (size_t) имеет решающее значение для проверки ошибок работает.

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