这是一个非常简单的问题。
我有一个带缓冲区[250]的结构。
struct testStruct{
char buffer[250];
};
如何在该缓冲区中添加“测试字符”?
我真的不能像newStruct.buffer =“test characters”那样做一个简单的任务;
答案 0 :(得分:1)
您可以使用 sprintf
或snprintf
或strcpy
或strncpy
这样的事情:
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
和strncpy
中的尺寸250,您可以使用sizeof
函数/指令代替)
这会将“测试字符”放入最后带有\0
字符的缓冲区数组中......
如果稍后需要,您可以使用strcat
函数向其附加更多字符串。
这是sprintf的man
页面:
答案 1 :(得分:0)
strcpy(newStruct.buffer, "test characters");
答案 2 :(得分:0)
newStruct.buffer = "test characters";
将"test characters"
的常量值放入数组buffer
的指针。显然你是C和C ++编程的新手,你应该多阅读一下,试试here和here。
答案 3 :(得分:0)
如果您拥有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));
答案 4 :(得分:0)
如果你想附加一个字符串说要添加,那么你应该使用标准的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';