#c
Вопрос:
Когда я создаю что-то вроде
char* t = new char[44];
t = strcpy(s,t);
затем strlen(t);
верните некоторые неправильные результаты. как я могу это изменить?
Ответ №1:
И strcpy
то, и другое, и strlen
ожидайте найти специальный символ NUL
или ''
в массиве. Неинициализированный массив, такой как созданный вами, может содержать вообще что угодно, что означает, что поведение вашей программы не определено, когда она передается в strcpy
качестве исходного аргумента.
Предполагая , что цель состояла в том, чтобы скопировать s
в t
, чтобы заставить программу вести себя так, как ожидалось, попробуйте это:
#include <iostream>
#include <cstring>
int main()
{
const char* s = "test string";
char* t = new char[44];
// std::strcpy(t, s); // t is the destination, s is the source!
std::strncpy(t, s, 44); // you know the size of the target, use it
std::cout << "length of the C-string in t is " << std::strlen(t) << 'n';
delete[] t;
}
Но имейте в виду, что в C строки обрабатываются как объекты типа std::string
.
#include <iostream>
#include <string>
int main()
{
const std::string s = "test string";
std::string t = s;
std::cout << "length of the string in t is " << t.size() << 'n';
}
Ответ №2:
Что ты пытаешься сделать? Вы хотите скопировать с s
на t
? Если это так, аргументы в strcpy
обратном порядке.
char* t = new char[44]; // allocate a buffer
strcpy(t,s); // populate it
Такая обработка строк в стиле C является красным флагом, но это все, что я могу сказать, учитывая эту небольшую информацию.
Ответ №3:
Этот код может оказаться полезным:
char * strcpy (char * destination, const char * source);
t = strcpy(t, s);
Ответ №4:
Вы должны инициализировать переменную t
Сделайте что-нибудь вроде этого:
char *t = new char[44];
memset(t, 0, 44);
// strlen(t) = 0
Комментарии:
1. Или с помощью
char* t = new char[44]();
, вы можете избавиться от memset.
Ответ №5:
strcpy
Функция описывается следующим образом:
#include <string.h>
char *strcpy(char *dest, const char *src);
Функция strcpy() копирует строку, на которую указывает by
src
(включая завершающий символ «»), в массив, на который указывает bydest
.
Итак, если вы пытаетесь заполнить свой недавно выделенный массив, вам следует сделать:
strcpy(t, s);
А не наоборот.