Это очень простой вопрос.
У меня есть структура с буфером символов [250].
struct testStruct{
char buffer[250];
};
Как добавить, пусть say-- "тестовые символы" в этот буфер?
Я не могу выполнить простое задание, например newStruct.buffer = "test characters";
newStruct.buffer = "test characters";
ставит постоянное значение "test characters"
на указатель buffer
массива. Очевидно, что вы новичок в программировании на C и C++, вы должны прочитать об этом немного больше, пожалуйста, попробуйте здесь и здесь.
newStruct.buffer
- это массив, а не указатель. Это назначение незаконно.
Вы можете использовать функцию 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
(вместо того, чтобы явно указывать размер 250 в snprintf
и strncpy
, вы можете использовать функцию sizeof
/инструкцию)
Это положит "тестовые символы" в буферный массив с символом \0
в конце...
Вы можете добавить к нему дополнительные строки с помощью функции strcat
если потребуется позже.
вот страница man
для sprintf:
Если вы хотите добавить строку, говорящую для добавления, вы должны использовать стандартные функции 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';
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));
strncpy
испортит ваши данные. Это не замена для тщательного проектирования и проверки.