Прежде всего,
У вас может быть много параметров для функции 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.)
в этом порядке, иначе есть шанс, что он не сработает. Дайте мне знать, если это поможет ...
Вы столкнулись с проблемой в
s1.name="Paolo";
, потому что в LHS вы используете тип array , который не является присваиваемым .
Для разработки из C11
главы §6.5.16
оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.
blockquote >и относительно изменяемого lvalue , из главы §6.3.2.1
Модифицируемое lvalue является значением l, которое не имеет типа массива, [.. .]
blockquote>Вам нужно использовать
strcpy()
для копировать в массив.Тем не менее
data s1 = {"Paolo", "Rossi", 19};
работает нормально, потому что это не является прямым назначением , связанным с оператором присваивания. Там мы используем список инициализаторов , заключенный в скобки , чтобы обеспечить начальные значения объекта . Это следует за законом инициализации, как указано в главе §6.7.9Каждый список инициализаторов, заключенных в фигурную скобку, имеет связанный текущий объект. Когда нет обозначений, подобъекты текущего объекта инициализируются в соответствии с типом текущего объекта: элементы массива в возрастающем порядке индекса, члены структуры в порядке объявления и первый именованный член союза. [... .]
blockquote>
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 в качестве примера.
Пожалуйста, проверьте этот пример здесь: Доступ к членам структуры
Понятно, что правильный способ сделать это выглядит так:
strcpy(s1.name , "Egzona");
printf( "Name : %s\n", s1.name);
char x[2] = {'h', 0}; *(char (*)[2])&x = *(char (*)[2])&x;
должен быть значительно быстрее, чем strcpy(x, x, 2)
, если он действителен. C.
– Dmitry
21 December 2017 в 01:31
char *b = "Hello"
, и если у меня естьchar c[] = "hello"
, то оба работают, если для первого случая я делаюb = "helloworld"
, он тоже работает, но для второго случая, если я делаюc = "helloworld"
, это не почему так? – Suraj Jain 26 December 2016 в 09:25