Узнав, что и strncmp
не то, что кажется, и strlcpy
не доступно в моей операционной системе (Linux), я подумал, что могу попытаться написать его сам.C странное поведение массива
Я нашел цитату из Ульриха Дреппера, поддерживающего libc, который разместил альтернативу strlcpy
, используя mempcpy
. У меня тоже нет mempcpy
, но это поведение было легко реплицироваться. Во-первых, это TestCase меня
#include <stdio.h>
#include <string.h>
#define BSIZE 10
void insp(const char* s, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%c ", s[i]);
printf("\n");
for (i = 0; i < n; i++)
printf("%02X ", s[i]);
printf("\n");
return;
}
int copy_string(char *dest, const char *src, int n)
{
int r = strlen(memcpy(dest, src, n-1));
dest[r] = 0;
return r;
}
int main()
{
char b[BSIZE];
memset(b, 0, BSIZE);
printf("Buffer size is %d", BSIZE);
insp(b, BSIZE);
printf("\nFirst copy:\n");
copy_string(b, "First", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
printf("\nSecond copy:\n");
copy_string(b, "Second", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
return 0;
}
И это его результат:
Buffer size is 10
00 00 00 00 00 00 00 00 00 00
First copy:
F i r s t b =
46 69 72 73 74 00 62 20 3D 00
b = 'First'
Second copy:
S e c o n d
53 65 63 6F 6E 64 00 00 01 00
b = 'Second'
Вы можете увидеть во внутреннем представлении (линии insp()
создан), что есть некоторый шум смешан в, как строка формата printf()
при проверке после первой копии и внешняя 0x01 во второй копии.
Строки копируются неповрежденными и корректно обрабатывают слишком длинные строки источника (давайте проигнорируем возможную проблему с передачей 0 как длины до copy_string
, теперь я исправлю это позже).
Но почему здесь находится содержимое внешнего массива (из строки формата) внутри моего адресата? Это как если бы пункт назначения был НАЗНАЧЕН, чтобы соответствовать новой длине.
Что такое внешний массив? – WhirlWind
В этом случае я имел в виду строковый литерал из printf, а именно «b = '% s», который получил «смешанный» с моим массивом «b», пункт назначения – LukeN
Обратите внимание, что источник для 'strlcpy()' и 'strlcat () 'довольно легко доступны по либеральной лицензии: http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/string/strlcpy.c?content-type=text%2Fplain –