Как конвертировать char [41] в char [40] - PullRequest
0 голосов
/ 02 декабря 2011

Обычно я делаю strcpy, но здесь похоже, что я не могу скопировать массив большего размера в массив меньшего размера.Я понимаю, что мне нужно пропустить элемент массива для него, я хочу пропустить первый элемент [0], но как я могу это сделать?Я действительно не хочу писать что-то похожее a[39]=b[40]; a[38]=b[39]... и т. Д.

Ответы [ 4 ]

11 голосов
/ 02 декабря 2011

Играть безопасно. Используйте strncpy вместо strcpy:

std::strncpy(a, b + 1, 40);

Это будет работать, даже если последний символ в b не равен '\0' или где-то есть '\0' где-то в индексе i.

strncpy особенно полезен, если a и b не должны рассматриваться как cstring , скорее они просто буфер , которые могут содержать или не содержать '\0'.

В C ++ вы также можете использовать std::copy как:

#include <algorithm> //include this!

std::copy(b + 1, b + 41, a); //b + 41 = (b + 1) + 40

Я обычно предпочитаю std::copy, поскольку он универсален и может использоваться с любым итеративным типом.

5 голосов
/ 02 декабря 2011

Вы можете просто использовать strcpy() со смещенными аргументами:

strcpy(a,b + 1);

Это пропустит первый символ b.

1 голос
/ 02 декабря 2011

Я не понимаю, почему вы должны использовать strcpy вместо memcpy.Следующий код будет эффективным, так как для процессоров SSE2 / SSE3 он будет использовать инструкции SIMD.

len=strlen(b)-1;
memcpy(a,b+1,len)

Если длина уже известна

memcpy(a,b+1,40)

Если вы работаете с массивом

memcpy(a,b+1,sizeof(b)/sizeof(b[0])-1)

Если вы хотите более безопасный подход:

#define min(a,b) ((a) < (b)?(a):(b))

......

memcpy(a,b+1,min(sizeof(b)/sizeof(b[0])-1,sizeof(a)/sizeof(a[0])))
1 голос
/ 02 декабря 2011

Вы можете просто скопировать исходную строку, начиная со второго символа:

char x[ 41 ];
char y[ 40 ];

/* ... */

strcpy( y, x + 1 );
...