我有一个指向数组的指针,该数组在运行时动态填充。收集并存储数组后,我希望数组的所有剩余缓冲区位置都填充空白区域。我怎么能这样做?
来自一些评论:
这就是我所拥有的:
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);
如何使用
' '
填充剩余的指针位置?
答案 0 :(得分:3)
您可以使用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
,否则您很容易受到缓冲区溢出的影响。其次,听起来你将把它作为字符串使用,在这种情况下,你要注意留下一个尾随的空值&#39; \ 0&#39;字符。
答案 1 :(得分:1)
这是我从你的问题中解释的
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;
希望这有帮助。
答案 2 :(得分:0)
我认为最简单的方法是在分配数组并将 ptr 分配到 buf 的开头之后。只需使用memset() {/ 1}}填写' '
所有内容。
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
因此,在您的操作结束时,缓冲区中尚未使用的所有剩余位置将具有' '
。
修改强>
我一直在考虑你问的问题,除非你有非常具体的理由用空格填充数组,这通常不是我们如何处理这种情况(请查看我在这个答案下面的评论)
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**!
注意复制后buf的大小为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**!