-1
 char activeip[11]="0123456789";
char buffer[1001];
int MAX_SIZE = 1000;

printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(buffer, "string here.......  ",MAX_SIZE+1);
printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );
printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(&buffer[strlen(buffer)],"Long string here.....................................", MAX_SIZE+1);
printf("MAX_SIZE %d\n", MAX_SIZE);
puts(buffer);

如您所见,我初始化 MAX_SIZE 为 1000。当 MAX_SIZE 不大于缓冲区时,MAX_SIZE 变为零。代码的输出如下:

MAX_SIZE 1000
MAX_SIZE 0
MAX_SIZE 0
string here.......  0123456789L

Process finished with exit code 0

如何将函数(strncpy 更改为我的局部变量(MAX_SIZE)?我的编译器是在 CLion 上运行的 minGW 谢谢您的回答

4

2 回答 2

1

这些电话

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );

strncpy(&buffer[strlen(buffer)],"Long string here.....................................", MAX_SIZE+1);

将第一个参数指向的数组附加 MAX_SIZE + 1 减去复制字符串的长度并加上零。

根据 C 标准(7.23.2.4 strncpy 函数)

3 如果 s2 指向的数组是一个短于 n 个字符的字符串,则将空字符附加到 s1 指向的数组的副本中,直到 n 个字符全部被写入。

因此,数组缓冲区之外的内存将被覆盖。您需要更改第三个参数的值,使其更小(考虑到复制字符串的长度和字符数组中使用的偏移量)。

于 2020-08-04T10:38:20.737 回答
0

关于像这样的陈述;

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );

activeip这不是附加该字符串的好方法。建议:

strcat( buffer, activeip );

或者

strncat( buffer, activeip, sizeof(buffer) - strlen buffer );
于 2020-08-05T06:22:31.393 回答