Получить данные с помощью программы из формы HTML - PullRequest
1 голос
/ 30 декабря 2011

Я создал следующую программу на C для получения данных из формы HTML.Но когда я пытаюсь скомпилировать и запустить его, я получаю:

ошибка сегментации 11 (ядро сброшено)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    char *N1,*N2,*N3,*N4,*N5;
    int cgi_length;
    char *cgi_data;
    printf("Content-type:text/html\n\n");
    cgi_length=atoi(getenv("CONTENT_LENGTH"));
    cgi_data=malloc(cgi_length+1);
    fread(cgi_data,1,cgi_length,stdin);
    printf("<HTML>");
    printf("<HEAD><TITLE>DATA</TITLE></HEAD><BODY>\n");
    printf("<H3>DATA</H3>\n");
    if(cgi_data == NULL)
    {
        printf("<P>Error! Error in passing data from form to script.");
    }
    else {
        printf("%s",cgi_data);
        sscanf(cgi_data,"N1=%s&N2=%s&N3=%S&N4=%SN5=%s",&N1,&N2,&N3,&N4,&N5);
        printf("<P>N1 is %s and N2 is %s and N3 is %S and N4 is %S and N5 is %s.",N1,N2,N3,N4,N5);
    }
}

Также, если я использую команду lsчтобы увидеть данные в каталоге cgi-bin , я вижу, что создан файл с именем myprogram.cgi.core .

Кто-нибудь знает, что не так?

Ответы [ 6 ]

1 голос
/ 19 августа 2013

У меня была такая же проблема раньше.Я использовал fgets в цикле while.fread не работает для меня.Попробуйте это:

cgi_length=atoi(getenv("CONTENT_LENGTH"));
    cgi_data=malloc(cgi_length+1);
    while(fgets(cgi_data,cgi_length,stdin)!=NULL){
//insert some processing here
}
0 голосов
/ 07 января 2013

Я почти уверен, что вы получаете ноль в этой строке

cgi_length=atoi(getenv("CONTENT_LENGTH"));

Проверьте, действительно ли определена эта переменная среды.И всегда проверяйте размеры перед выделением памяти и перед тем, как поместить в нее какие-либо данные.

0 голосов
/ 30 декабря 2011

Есть несколько фундаментальных ошибок программирования на Си. Используйте, например, чтобы узнать некоторые из них. Например, вы объявляете N1 как символьный указатель, но не инициализируете его, и вы передаете его адрес в качестве аргумента. Вам нужно как-то выделить массив символов и передать указатель на него в качестве аргумента sscanf.

0 голосов
/ 30 декабря 2011

Если вы скомпилируете с -Wall (все предупреждения), это даст вам представление о том, что не так

cgi.c: In function ‘main’:
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 5 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 6 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 7 has type ‘char **’ [-Wformat]
cgi.c:24:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 4 has type ‘char *’ [-Wformat]
cgi.c:24:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 5 has type ‘char *’ [-Wformat]
cgi.c:26:1: warning: control reaches end of non-void function [-Wreturn-type]
0 голосов
/ 30 декабря 2011

Вы должны убедиться, что возвращаемое значение вашего вызова функции getenv не является нулевым указателем. Передача нулевого указателя на atoi - неопределенное поведение. Я предлагаю также проверить возвращаемое значение всех ваших вызовов функций и использовать функцию strtol вместо atoi, поскольку atoi не может обнаружить ошибки.

0 голосов
/ 30 декабря 2011

Загрузить coredump в GDB.Попробуйте что-то вроде:

 gdb myprogram.cgi myprogram.cgi.core

возможно замените myprogram.cgi на правильное имя CGI.

Когда вы находитесь в GDB, вы можете получить обратную трассировку, чтобы увидеть, где произошло сбой приложения.набрав bt в консоли.

Здесь вы можете найти краткое руководство по работе с GDB: http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html

Несколько заметок ...:

  • Проверитьто, что getenv возвращает, может быть, оно возвращает NULL вместо значения переменной среды.
  • sscanf копирует значения строк в буферы, на которые указывает N1 N2 N3 N4 N5, было бы целесообразносначала выделите немного памяти для этих указателей ...
  • Вам не нужно получать ссылку на точки N1 N2 N3 N4 N5
  • Как заметил Даниэль Фишер: fread не завершает строку 0.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...