尝试将 char[] 存储到 char* 时出现问题
Probleme when trying to store char[] into char*
我目前正在 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"));
然后在尝试显示数据时显示奇怪的字符。
您正在返回一个指向局部变量 (stock) 的指针,如果函数完成,该变量将不再可用。
使库存保持静态以使其保持不变
要么
使其成为动态分配的内存
要么
将 fname 传递给函数并将其存储在那里。
在任何情况下,您都需要确保存储内容的内存在您使用时一直存在。
相反,返回指向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"));
在浏览器中输入。
但是,您应该检查是否有太长的参数和没有 38 的字符串。在您当前的版本中,存在缓冲区溢出的攻击向量。
我目前正在 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"));
然后在尝试显示数据时显示奇怪的字符。
您正在返回一个指向局部变量 (stock) 的指针,如果函数完成,该变量将不再可用。
使库存保持静态以使其保持不变 要么 使其成为动态分配的内存 要么 将 fname 传递给函数并将其存储在那里。
在任何情况下,您都需要确保存储内容的内存在您使用时一直存在。
相反,返回指向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"));
在浏览器中输入。
但是,您应该检查是否有太长的参数和没有 38 的字符串。在您当前的版本中,存在缓冲区溢出的攻击向量。