динамическое распределение значений указателя - PullRequest
0 голосов
/ 08 июня 2011

У меня есть указатель, указывающий на массив, который динамически заполняется во время выполнения.После сбора и сохранения массива я хочу, чтобы все оставшиеся буферные позиции массива были заполнены пустым пространством.Как я могу это сделать?


Из некоторых комментариев:

Вот что у меня есть:

 char buf[50];
 char *ptr = buf;
 strncpy(ptr, info.a, strlen(info.a));
 ptr += strlen(info.a);
 strncpy(ptr, info.b, strlen(info.b));
 ptr += strlen(info.b);
 strncpy(ptr, info.c, strlen(info.c));
 ptr += strlen(info.c);

Какзаполнить оставшиеся позиции указателя ' '?

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Вы можете использовать memset (3), чтобы заполнить область памяти пробелами:

size_t total_size = get_total_size(); // total size of array, in bytes
size_t len = get_len(); // length of content, in bytes, <= total_size
assert(len <= total_size);
char *array = malloc(total_size);
// ... fill the first len bytes with your data
memset(&array[len], ' ', total_size - len); // and the rest to ' ' chars

Однако при таком подходе есть пара проблем. Во-первых, вы подвержены переполнению буфера, если только вы тщательно не проверите это len < total_size. Во-вторых, похоже, что вы собираетесь использовать это как строку, и в этом случае вам нужно позаботиться о том, чтобы оставить завершающий нулевой символ '\ 0'.

1 голос
/ 08 июня 2011

Это то, что я интерпретировал из вашего вопроса

int Array[20];
int *p=Array;
int no,i,len;
char ch=' '; 
len=sizeof(Array)/sizeof(int)
printf("Enter no of elements "); 
scanf("%d",&no);
for(i=0;i<no;i++)
    scanf("%d",p+i);   
for(i=no;i<len;i++)
    p[i]=(int )ch;

Надеюсь, это поможет.

0 голосов
/ 09 июня 2011

Я думаю, что самый чистый способ сделать это - сразу после выделения массива и присвоения ptr началу buf . Просто заполните все с помощью ' ', используя memset () .

 char buf[50];
 char *ptr = buf;
 memset (ptr, ' ', sizeof(buf)); // like this

 // If this buffer is meant to be printed to the screen or used as a string,
 // it's probably better to write the end-of-string character at the last 
 // position of the buffer:
 buf[49] = 0;

 // operations to write stuff on the buffer

Таким образом, в конце ваших операций все оставшиеся места в буфере, которые не были использованы, будут иметь ' '.

EDIT:

Я думал о том, что вы спросили, и если у вас нет особых причин для заполнения массива пробелами , как правило, мы не справляемся с этой ситуацией (см. Мой комментарий ниже этого ответа).

char* tmp_string = "**Copy Me**";
printf("Size of string:%d\n", strlen(tmp_string));

char buf[50];
printf("Size of buf:%d\n", sizeof(buf));
memset(buf, 0, sizeof(buf)); // cleaning the entire buffer

char *ptr = buf;
strncpy(ptr, tmp_string, strlen(tmp_string));
ptr += strlen(tmp_string);
*ptr = '!';

printf("Size of buf after copy: %d\n", strlen(buf));
printf("Result: %s\n", buf);

Выходы:

Size of string:11
Size of buf:50
Size of buf after copy: 12
Result: **Copy Me**!

Обратите внимание , что размер буфера после копирования равен 12. Это потому, что мы обнулили буфер в начале операций (т.е. заполнил буфер \0). При первом знаке \0 в буфере printf () прекращает итерацию в массиве и печатает символы.

ОДНАКО , я могу вспомнить одну хорошую причину, почему вы не хотите этот метод. Ниже приведено небольшое изменение кода выше. Он заполняет буфер пробелами и добавляет символ конца строки (\0) в последней позиции буфера. Обратите внимание , что размер строки в конце не 12! Это 49 , потому что вы заполнили буфер допустимыми символами.

char* tmp_string = "**Copy Me**";
printf("Size of string:%d\n", strlen(tmp_string));

char buf[50];
printf("Size of buf:%d\n", sizeof(buf));
memset(buf, ' ', sizeof(buf)); // cleaning the entire buffer with empty spaces
buf[49] = 0; // setting a \0 at the end of the string

char *ptr = buf;
strncpy(ptr, tmp_string, strlen(tmp_string));
ptr += strlen(tmp_string);
*ptr = '!';

printf("Size of buf after copy: %d\n", strlen(buf));

printf("Result: %s\n", buf);

Выходы:

Size of string:11
Size of buf:50
Size of buf after copy: 49
Result: **Copy Me**!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...