我正在Debian上用C开发一个Web应用程序(不要问我原因)。 我做了一个方法来使用POST从表单中获取数据:
const char* getParam(char* postResult, char* param)
{
char stock[30];
char* pointer = strstr(postResult, param);
while(*pointer != 61)
pointer++;
int i = 0;
++pointer;
while(*pointer != 38)
{
stock[i] = *pointer;
i++;
*pointer++;
}
stock[i] = 0;
const char *result;
if(stock[0] == 0) {
result = "";
}else{
result = stock;
}
return result;
}
调用此方法时,我将数据存储在由
声明的变量中char fname[40];
像这样
strcpy(fname,getParam(ptr, "firstn"));
然后,当试图显示数据时,它会显示奇怪的字符。
答案 0 :(得分:0)
如果函数完成,您将返回一个指向本地变量(stock)的指针,该变量不再可用。
让库存保持静止状态 要么 使它成为动态分配的内存 要么 将fname传递给函数并将其存储在那里。
在任何情况下,只要您使用内存,就需要确保存储内容的内存。
答案 1 :(得分:0)
而返回指向getParam()
内的局部变量的指针,您可以传递指向缓冲区的指针。
const char* getParam(char *stock, char* postResult, char* param)
{
// char stock[20] you do not need that anymore
char* pointer = strstr(postResult, param);
while(*pointer != 61)
pointer++;
// int i = 0;
++pointer;
// Move that up
if( pointer==0 )
{
*stock=0;
return;
}
while(*pointer != 38)
{
*stock = *pointer;
stock++;
*pointer++;
}
stock = 0;
}
在这种情况下,您也不需要使用strcpy()
:
char fname[40];
getParam(fname, ptr, "firstn"));
键入浏览器。
但是,你应该检查args和没有38的字符串。在你当前版本中有一个缓冲区溢出的攻击向量。