Я обычно использую определенный набор имен переменных в этих ситуациях, называемый:
src
- источник
dst
- пункт назначения
end
- конец источника (используется здесь) или пункта назначения
Итак:
int main(void)
{
char string1[] = "something";
int start = 2;
int count = 3;
char string2[10] = {0};
const char *src = &string1[start];
const char *end = &string1[start+count];
char *dst = string2;
assert(count < sizeof(string2);
while (src < end)
*dst++ = *src++;
*dst = '\0'; // Null-terminate copied string!
printf("%s",&string2);
return(0);
}
Или, что более правдоподобно, упаковано как функция:
char *copy_substr(char *dst, const char *str, size_t start, size_t len)
{
const char *src = str + start;
const char *end = src + len;
while (src < end)
*dst++ = *src++;
*dst = '\0';
return(dst);
}
int main(void)
{
char string1[] = "something";
char *end;
char string2[10] = {0};
end = copy_substr(string2, string1, 2, 3);
printf("%s",&string2);
return(0);
}
Функция возвращает указатель на конец строки, что является условным и не дает заметного преимущества в примере, но имеет некоторые преимущества при построении фрагмента строки:
struct substr
{
const char *str;
size_t off;
size_t len;
};
static struct substr list[] =
{
{ "abcdefghijklmnopqrstuvwxyz", 2, 5 },
...
{ "abcdefghijklmnopqrstuvwxyz", 18, 3 },
};
int main(void)
{
char buffer[256];
char *str = buffer;
char *end = buffer + sizeof(buffer) - 1;
size_t i;
for (i = 0; i < 5; i++)
{
if (str + list[i].len >= end)
break;
str = copy_substr(str, list[i].str, list[i].off, list[i].len);
}
printf("%s\n", buffer);
return(0);
}
Суть в том, что возвращаемое значение - указатель на NUL в конце строки - это то, что вам нужно для операций конкатенации строк. (В этом примере со строками, имеющими известную длину, вы могли бы выжить без этого возвращаемого значения без необходимости многократного использования strlen () или strcat (); в тех случаях, когда вызываемая функция копирует количество данных, которое не может быть определено вызывающим подпрограмма, указатель на конец еще более полезен.)