Активное копирование данных

#c

#c

Вопрос:

Правильно ли это выражение?

 {
    char a;
    char *temp;
    for(int j = 0; j < len; j  )
    {
        strcpy(amp;temp[j], (char*)a);
    }
}
  

в этом случае код a обновляется извне пользовательским вводом / нажатием клавиши. Я хочу скопировать все входящие / обновленные данные a в temp как целую строку.

Комментарии:

1. @ObscureRobot: Вы можете создавать именованные ссылки в комментариях в формате [имя] (адрес).

2. это ошибка в коде StackOverflow, которая автоматически превращает короткие ответы в комментарии. Я думал, что уже удалил этот комментарий, я удалил его еще раз.

Ответ №1:

Поскольку ‘ a ‘ в вашем примере не завершается нулем, и вы хотите назначить один символ в строковом буфере, вы можете сделать:

  int const buffer_size = 5;
 char a = 'c';
 char *temp = new char[buffer_size]; // Remember to allocate your string buffer
 temp[index] = a;
 // .....

 delete[] temp; // free buffer.
  

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

Ответ №2:

Нет по нескольким причинам:

  • temp не инициализируется, оно указывает на какое-то случайное местоположение, и для него не выделено никакой памяти, так что вы просто будете записывать поверх случайной части памяти (и / или аварийно завершите работу).
  • a является одиночным, char и вы обрабатываете его значение как строку ( char* ), используя strcpy (я предполагаю, что вы имели в виду, (char*)amp;a что все еще неверно).
  • strcpy продолжает копирование char данных из источника ( a ) в пункт назначения, пока не достигнет '' в источнике…которое может быть где угодно, поскольку a это не строка с нулевым завершением, а char .

Если вы хотите записать / добавить единицу char в строку / буфер, вы просто делаете buffer[position] = character , где buffer — это char[] или a char* , указывающее на блок выделенной памяти, position — это позиция в буфере, которую вы хотите вставить char , и character очевидно, что это так char .

В любом случае, я понятия не имею, что вы пытаетесь сделать, или логику, лежащую в основе того, почему вы пытаетесь сделать то, что вы пытаетесь сделать вот так.

РЕДАКТИРОВАТЬ: А также у вас это помечено как C , почему вы не используете std::string и std::cin используете ли вы на самом деле C ?

Ответ №3:

Ваш код ошибочен во многих отношениях:

  1. Вы не можете преобразовать символ в символ char*. Вы должны сделать что-то вроде этого: (char *)amp;a; и поскольку a это символ, вам вообще не нужно его приводить.

  2. Вам не нужно strcpy это. Вы можете просто сделать что-то вроде: temp[j] = a;

  3. char *temp ему не назначена связанная память. Итак, вам нужно сделать что-то вроде этого: char *temp = malloc(sizeof(char) * len);

Полный код здесь:

 {
 char a = myFunToGetInput();
 char *temp = malloc(sizeof(char) * len));
 for(int j = 0; j < len; j  ) {
   temp[j] = a;
 }
}
  

Или, если вы уже использовали memset ранее:

 {
 char a = myFunToGetInput();
 char *temp = malloc(sizeof(char) * len));
 memset(temp, (unsigned char)a, len);
}
  

Комментарии:

1. Это было бы хорошим ответом для C. В C используйте std::string , чтобы избежать утечек памяти.

2. В последнее время много работал с C, поэтому это застряло у меня в голове. Тем не менее, спасибо за совет.