2015-05-15 6 views
3

Я хотел бы сделать что-то вроде этого:Какой самый быстрый способ получить кусочек массива в c?

char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'}; 

char out[3]; 

out = ∈ 

и получить только первые 3 символа

, но я получаю сообщение об ошибке несовместимых типов

+0

Используйте указатель или скопируйте требуемый фрагмент; массивы не могут быть назначены. – Downvoter

+1

@AndrejsCainikovs Это неправильно во многих отношениях. 'printf' принимает' char * ', а не' char', он даже не компилируется. –

+0

@MarkSegal: https://ideone.com/FyMERy Да, я сделал одну глупую ошибку, не печатая ни одного символа.Но, пожалуйста, укажите все способы, по которым я был неправ. –

ответ

8

out является именем массива, который не может быть изменен. Там нет прямого способа получить кусочек массива в C. Вы можете использовать memcpy:

memcpy(out, in, sizeof out); 

И вы должны принять, что in имеет достаточно элементы, входящие копировать с.

3

out является имя массива и массив может» t - модифицируемое значение l.

Массивы не являются назначаемыми в C.

4

Как ваши массивы не предназначены для размещения строк, то соответствующий код может выглядеть следующим образом

#include <stdio.h> 

int main() 
{ 
    char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'}; 
    size_t n = sizeof(in); 
    char out[3]; 

    memcpy(out, in, sizeof(out)); 
    n -= sizeof(out); 
    memmove(in, in + sizeof(out), n); 

    printf("%*.*s\n", n, n, in); 
    printf("%*.*s\n", sizeof(out), sizeof(out), out); 

    return 0; 
} 

Выход программы

dfrtbhjli 
abc 

Примите во внимание, что вы должны отслеживать фактическое длина массива в.

Другой пример

#include <stdio.h> 

int main() 
{ 
    char in[] = {'a','b','c','d','f','r','t','b','h','j','l','i'}; 
    size_t n = sizeof(in); 
    char out[3]; 

    printf("%*.*s\n\n", n, n, in); 

    while (!(n < 3)) 
    { 
     memcpy(out, in, sizeof(out)); 
     n -= sizeof(out); 
     memmove(in, in + sizeof(out), n); 

     printf("%*.*s\n", sizeof(out), sizeof(out), out); 
    } 

    return 0; 
} 

Выход программы

abcdfrtbhjli 

abc 
dfr 
tbh 
jli 
1

Я предлагаю три способа:

strncpy(out, in, sizeof out)

memcpy(out, in, sizeof out)

sscanf(in, "%3s", out)

Кроме того, вы должны сделать out статические или глобальные, или все оставьте его в кучу, используя malloc. Просто чтобы убедиться, что что-либо за пределами или из первых трех символов не будет скопировано на него.

// global 
char out[3]; 
int main() {... 

.

// static 
static char out[3]; 

.

// heap 
char *out = (char*) malloc(sizeof(char) * 3); 
free(out); 

Это зависит от вас, что выбрать.

Смежные вопросы