У меня есть CGI-скрипт (C program test.elf
) , который вызывается методом GET. Это означает, что данные добавляются к URL-адресу, который указывает на тот же сценарий CGI. Например:
http://.../cgi/c/test.elf?m=20&n=2000
Здесь мы отправляем набор данных m=20&n=2000
, который отделен от остальной части URL знаком вопроса ?
. Отдельные переменные в наборе данных также разделяются &
. Так что на самом деле мы отправляем m=20
и n=2000
.
Интерфейс CGI автоматически сохраняет отправленный набор данных m=20&n=2000
в переменной среды QUERY_STRING
на время вызова, и я хочу, чтобы мой сценарий CGI сначала напечатал его (a) значение и (b) адрес.
Это CGI-скрипт:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
// getenv() returns a pointer to character (char*) and we need same type (char*) to store it.
char* data;
// We need an "array of characters" which is actualy the same as "string of characters".
// Because strcpy() can only take pointer to the start of the array we also define another
// pointer and point it to array.
char stored_enviromental_variable[1000];
char* pointer;
pointer = &stored_enviromental_variable[0];
// ASCII HTML header
printf("content-type:text/html; charset=utf-8\n\n");
printf("<h1>Multiplication result</h1>");
// Pointer now points to enviromental variable.
data = getenv("QUERY_STRING");
// We store the value of pointer
strcpy(pointer, data);
// We print some information.
printf("%s: %s<br>", "Value of the \"QUERY_STRING\"", stored_enviromental_variable);
printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);
}
Это компилируется с предупреждением:
[ziga@localhost ~]$ gcc -Wpedantic -std=c18 -Wall -o test.elf test.c
test.c: In function ‘main’:
test.c:42:15: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘char *’ [-Wformat=]
printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);
~^ ~~~~
%s
Таким образом, похоже, что этот исходный код вызывает проблему:
printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);
Что странно для меня, потому что я подумал, что "указатель всегда хранит местоположение" . Итак, почему data
хранит символ? Как я могу удалить предупреждение?
Если я вызываю скрипт CGI в браузере, где я получаю это: