#c #cgi
Вопрос:
Я получаю форму ошибки sscanf, когда пытаюсь прочитать строку. Получите определенную часть строки. Я получаю строку из HTML — файла и использую CGI в качестве серверной стороны для чтения из формы.
<!DOCTYPE html>
<html>
<head>
<title>CGI-zoo</title>
<style>
body {
text-align: center;
}
#nameErrorMsg {
color: red;
}
#title {
color: orange;
}
#animalDiv {
border-style: groove;
}
</style>
</head>
<body>
<script>
//global variable for name
var name;
//function :check()
//Parameters : void
//Returns : void
//Description : This function will make sure that the user enters something for the name and does not leave the text box blank
function checkName()
{
name= name=document.getElementById("nameEntered").value;
if(name==""||name==undefined)
{
//error msg
document.getElementById("nameErrorMsg").innerHTML="This text box can not be blank";
return false;
}
else {
//hide the name text box and button
document.getElementById("nameDiv").hidden=true;
//unhides the drop list
document.getElementById("askingUserWhatAnimal").innerHTML="Hello " name ", Please choose one of the six animals to learn some facts from";
document.getElementById("animalDiv").hidden=false;
//unhide the submit form button
document.getElementById("submitForm").hidden=false;
return true;
}
}
</script>
<form id="cgiZoo" action="animal.exe" method="get">
<h1 id="title"> cgi-Zoo</h1>
<hr>
<div id="nameDiv">
<p id="nameErrorMsg"></p>
<label id="nameLabel">Name:</label>
<input type="text" id="nameEntered" placeholder="Name" name="nameEntered" v>
<button type="button" onclick="checkName()" id="nameCheckBtn">Submit </button>
</div>
<!---Animal drop down list -->
<div hidden id="animalDiv">
<p id="askingUserWhatAnimal"></p>
<label>Animals</label>
<select name="animalList" id="animalList" required="required">
<option></option>
<option value="Lion">Lion</option>
<option value="Elephant">Elephant</option>
<option value="Giraffe">Giraffe</option>
<option value="Moneky">Moneky</option>
<option value="Zebra">Zebra</option>
<option value="Panda">Panda</option>
</select>
<br>
<br>
</div>
<br>
<input hidden type="submit" id="submitForm" form="cgiZoo" name="submit">
</form>
</body>
</html>
Когда вы отправляете эту форму, предполагается, что она приведет вас к сценарию на стороне сервера, который в основном сообщает пользователям, какое имя они ввели и какое животное они выбрали с помощью CGI.
Но у меня возникла проблема при попытке прочитать и склеить строку из данных с помощью sscanf
CGI-код с использованием C
#include <iostream>
#include <string.h>
#pragma warning(disable: 4996)
#define CGI_VARS 30
#define SEND_METHOD 19 // REQUEST_METHOD tells us if the form was sent using GET or POST
#define DATA_LENGTH 14
using namespace std;
int main()
{
cout << "Content-type:text/htmlrnrn";
cout << "<html>n";
cout << "<head>n";
cout << "<title>CGI Environment Variables</title>n";
cout << "</head>n";
cout << "<body>n";
char* data;
char* name;
char *animal;
//returns pointer
data = getenv("QUERY_STRING");
if (sscanf(data, "nameEntered=%samp;animalName=%s", name, animal));
cout << name;
cout << animal;
cout << "</body>";
return 0;
}
Мы были бы признательны за большую помощь в этом. Я не знаю, что я делаю не так. Ниже я покажу, как должен выглядеть результат.
Выход:
name="bob"
animal="lion"
Комментарии:
1.
name
иanimal
являются неинициализированными указателями. Передача ихsscanf
— это неопределенное поведение. Вместо этого сделайте что-то подобноеchar name[256] = {0};
и то же самое дляanimal
.if
Окружениеsscanf
ничего не делает, так как вы не действуете в соответствии с этим условием. Вы также должны проверить, верен лиgetenv
возвращенный указатель, прежде чем использовать его.2. @Питер Я заметил, что вы приняли, а затем отвергли ответ, так что, я думаю, были какие-то проблемы? Пожалуйста, спросите, если что-то неясно или если это не сработало по какой-то причине.
Ответ №1:
name
и animal
не указывает на какую-либо выделенную вами память. Одним из простых исправлений может быть превращение их в char[]
s:
char name[256];
char animal[256];
char* data = getenv("QUERY_STRING");
// check that data is non-null and check the sscanf result:
if(data amp;amp; sscanf(data, "nameEntered=%5[^amp;]amp;animalName=%5[^amp;]", name, animal) == 2)
{ // ^^^ ^^^
// limit the scan to the size of the char[] - 1
std::cout << "name="" << name << ""nnanimal="" << animal << ""n";
}
Примечание %[^amp;]
вместо %s
для сканирования. Он сканирует до, но не включая amp;
.