这是一个非常简单的问题。
我有一个带有字符缓冲区[250] 的结构。
struct testStruct{
char buffer[250];
};
我该如何添加,比如说——“测试字符”到那个缓冲区?
我真的不能做一个像 newStruct.buffer = "test characters"; 这样简单的任务。
您可以使用函数sprintf
orsnprintf
或strcpy
orstrncpy
所以是这样的:
sprintf(newStruct.buffer,"%s","test characters"); // doesnt protect against buffer overflow
snprintf(newStruct.buffer,250,"%s","test characters"); // guards against overflows
strcpy(newStruct.buffer,"test characters"); // as suggested in another answer also doesnt guard against overflows
strncpy(newStruct.buffer,"test characters",250);// guards against overflows
snprintf
(而不是在and中明确提到大小 250 strncpy
,您可以改用sizeof
函数/指令)
这会将“测试字符”放入缓冲区数组\0
中,最后有一个字符......
如果以后需要,您可以使用strcat
函数向其附加更多字符串。
这是man
sprintf 的页面:
strcpy(newStruct.buffer, "test characters");
当你有一个数组时char
,你可以使用strcpy
. 此函数将复制每个字符,直到字符串的末尾('\0' 也被复制)。您也可以strncpy
用于安全事务。
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
请记住,参数的顺序实际上与做作相同:dest = src
。
您还可以sprintf
用于更高级的东西。它类似于printf
但写入字符串。
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
但是,如果您没有已分配的字符串,请查看strdup
何时可以释放源字符串。
回到你的情况,你不能写这样的东西:newStruct.buffer = "test characters";
因为它会试图改变地址newStruct.buffer
指向其他地方。这只能使用指针 ( char*
) 而不是数组。
strcpy(newStruct.buffer, "test characters");
或者
strncpy(newStruct.buffer, "test characters", sizeof(newStruct.buffer));
如果您要附加一个字符串来表示添加,那么您应该使用标准 C 函数 strcat 或 strncat ,前提是缓冲区中的最后一个实际字符是终止零。如果要将字符串从缓冲区的第一个字符开始复制到缓冲区中,则应使用标准 C 函数 strcpy 或 strncpy。例如,如果您确定字符串的长度小于 250,那么您可以简单地编写
std::strcpy( buffer, "test characters" );
如果您不知道要复制的字符串的大小,则可以使用 strncpy
std::strncpy( buffer, SomeString, 250 );
buffer[249] = '\0';
在这种情况下,副本可能会被截断。
如果缓冲区已经包含一些字符串并且您要附加一个新字符串,那么您的选择会再次决定您是否确定新字符串适合缓冲区,
如果你确定,那么你可以写
strcat( buffer, "test characters" );
如果你不确定你可以写
size_t n = 250 - std::strlen( buffer );
strcat( buffer, SomeString, n );
buffer[249] = '\0';