присвойте строковое значение структуре массива [duplicate]

Прежде всего,

У вас может быть много параметров для функции mail () ... У вас может быть 5 макс. mail(to,subject,message,headers,parameters); Что касается переменной $from, которая должна автоматически поступать с вашего веб-хостинга, если вы используете linux cPanel. Он автоматически исходит из вашего имени пользователя и ip-адреса cPanel.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Также убедитесь, что у вас есть правильный порядок переменных в вашей функции mail (). mail($to,$subject,$message,etc.) в этом порядке, иначе есть шанс, что он не сработает. Дайте мне знать, если это поможет ...

22
задан Chief096 14 May 2016 в 11:04
поделиться

3 ответа

Вы столкнулись с проблемой в

 s1.name="Paolo";

, потому что в LHS вы используете тип array , который не является присваиваемым .

Для разработки из C11 главы §6.5.16

оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.

и относительно изменяемого lvalue , из главы §6.3.2.1

Модифицируемое lvalue является значением l, которое не имеет типа массива, [.. .]

Вам нужно использовать strcpy() для копировать в массив.

Тем не менее data s1 = {"Paolo", "Rossi", 19}; работает нормально, потому что это не является прямым назначением , связанным с оператором присваивания. Там мы используем список инициализаторов , заключенный в скобки , чтобы обеспечить начальные значения объекта . Это следует за законом инициализации, как указано в главе §6.7.9

Каждый список инициализаторов, заключенных в фигурную скобку, имеет связанный текущий объект. Когда нет обозначений, подобъекты текущего объекта инициализируются в соответствии с типом текущего объекта: элементы массива в возрастающем порядке индекса, члены структуры в порядке объявления и первый именованный член союза. [... .]

31
ответ дан Sourav Ghosh 21 August 2018 в 22:51
поделиться
  • 1
    Если у меня есть char *b = "Hello", и если у меня есть char c[] = "hello", то оба работают, если для первого случая я делаю b = "helloworld", он тоже работает, но для второго случая, если я делаю c = "helloworld", это не почему так? – Suraj Jain 26 December 2016 в 09:25
  • 2
    @SurajJain - это именно то, что объясняется в ответе. Вы не можете назначить массив. – Sourav Ghosh 24 June 2017 в 13:23
typedef struct{
     char name[30];
     char surname[30];
     int age;
} data;

определяет, что data должен быть блоком памяти, который соответствует 60 символам плюс 4 для int *

[----------------------------,------------------------------,----]
 ^ this is name              ^ this is surname              ^ this is age

. Это выделяет память в стеке.

data s1;

Присвоения просто копируют числа, иногда указатели.

Это не работает

s1.name = "Paulo";

, потому что компилятор знает, что s1.name является началом структуры длиной 64 байта, и "Paulo" является char [] длиной 6 байтов (6 из-за чередующихся строк \ 0 в C). Таким образом, пытается назначить указатель на строку в строку.

Чтобы скопировать «Paulo», в структуру в точке name и «Rossi» в структуру в точке surname.

memcpy(s1.name,    "Paulo", 6);
memcpy(s1.surname, "Rossi", 6);
s1.age = 1;

В итоге вы

[Paulo0----------------------,Rossi0-------------------------,0001]

strcpy делает то же самое, но знает о завершении \0, поэтому не требуется жестко закодированная длина.

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

typedef struct {
  char *name;
  char *surname;
  int age;
} data;

Это создаст

[----,----,----]

Теперь это будет работать, потому что вы заполняете структуру указателями.

s1.name = "Paulo";
s1.surname = "Rossi";
s1.age = 1;

Что-то вроде этого

[f 10]

Где 4 и 10 являются указателями.

* N.B. ints и указатели могут быть разных размеров, размеры 4 выше - 32bit в качестве примера.

3
ответ дан teknopaul 21 August 2018 в 22:51
поделиться

Пожалуйста, проверьте этот пример здесь: Доступ к членам структуры

Понятно, что правильный способ сделать это выглядит так:

strcpy(s1.name , "Egzona");
printf( "Name : %s\n", s1.name);
8
ответ дан user 21 August 2018 в 22:51
поделиться
  • 1
    у этого есть избыточная служебная нагрузка функции (какие компиляторы могут выбрать встроенную, но, как правило, нет), что делает цикл, а не встроенный, и этот цикл не устраняется, если машина, которую вы компилируете, может скопировать всю вещь за один ход , он всегда выполняет по крайней мере одну итерацию. Похоже, что это невозможно решить без предварительной обработки исходного кода, так как C не сделает это за вас. char x[2] = {'h', 0}; *(char (*)[2])&x = *(char (*)[2])&x; должен быть значительно быстрее, чем strcpy(x, x, 2), если он действителен. C. – Dmitry 21 December 2017 в 01:31
Другие вопросы по тегам:

Похожие вопросы: