尝试将char []存储到char *时出现问题

时间:2017-11-24 05:50:08

标签: c debian strcpy strcat

我正在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"));

然后,当试图显示数据时,它会显示奇怪的字符。

2 个答案:

答案 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的字符串。在你当前版本中有一个缓冲区溢出的攻击向量。