Как добавить к уже выделенному символу?

0

Это очень простой вопрос.

У меня есть структура с буфером символов [250].

struct testStruct{
   char buffer[250];
};

Как добавить, пусть say-- "тестовые символы" в этот буфер?

Я не могу выполнить простое задание, например newStruct.buffer = "test characters";

  • 1
    Почему бы не искать строку - то есть cplusplus.com/reference/string/string
  • 0
    Какой язык вы используете - C или C ++? Вы знаете, это два разных языка.
Теги:

5 ответов

0
Лучший ответ

newStruct.buffer = "test characters"; ставит постоянное значение "test characters" на указатель buffer массива. Очевидно, что вы новичок в программировании на C и C++, вы должны прочитать об этом немного больше, пожалуйста, попробуйте здесь и здесь.

  • 1
    newStruct.buffer - это массив, а не указатель. Это назначение незаконно.
  • 0
    В C имя массива является указателем на его первый индекс.
Показать ещё 7 комментариев
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

(вместо того, чтобы явно указывать размер 250 в snprintf и strncpy, вы можете использовать функцию sizeof/инструкцию)


Это положит "тестовые символы" в буферный массив с символом \0 в конце...

Вы можете добавить к нему дополнительные строки с помощью функции strcat если потребуется позже.

вот страница man для sprintf:

http://linux.die.net/man/3/sprintf

  • 0
    strcpy дает вам шанс переполнения
  • 0
    sprintf также может переполниться
Показать ещё 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';
0
strcpy(newStruct.buffer, "test characters");
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));
  • 0
    Если вы передадите ей слишком длинную строку, strncpy испортит ваши данные. Это не замена для тщательного проектирования и проверки.
  • 0
    @PeteBecker Я согласен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню