0

我对 C 非常陌生,我正在尝试将从 main 之后的 decode 函数返回的数组分配给一个指针,以便我可以在我的程序中使用它(例如打印它)。代码可以编译,但是当我运行 CGI 时出现“错误 500”。

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>

int main(int argc, char **argv, char **envp) {

printf("Content-type: text/html\n\n");

char *decode(char *url);

char *qPtr;
char *ePtr;
char *emailClean;

if(qPtr = getenv("QUERY_STRING")) {
  char Buffer[256];
  char *Token;
  char username[80], password[80], email[80];
  strncpy(Buffer, qPtr, 255); //copy Env variable "QUERY_STRING" into qPtr pointer

  Token = strtok(Buffer, "&"); //get first query
  sscanf(Token, "username=%s", username); //gets value of username field input

  Token = strtok(NULL, "&"); //get second query
  sscanf(Token, "password=%s", password); //gets value of password field input

  Token = strtok(NULL, "&"); //get third query
  sscanf(Token, "email=%s", email); //gets value of email field input

  ePtr = email;

//decode email
  emailClean = decode(ePtr);
 printf("%s\n", *emailClean);

}
 else { printf("<p>Error: did not get a QUERY_STRING variable."); }
 }

char *decode(char *url) {
  char *emailNew;
  int i = 0;
  int y = 0;
  char current = url[i];

while(current != '%') {
   emailNew[i] = current;
   y++;
   current = url[i++];
 }
  return emailNew;
}

谢谢!

4

3 回答 3

1
  char *emailNew;

  /* ... */

  while(current != '%') {
     emailNew[i] = current;
     y++;
     current = url[i++];
  }

emailNew指针未初始化,因此emailNew[i] = current赋值调用未定义的行为。

还:

 printf("%s\n", *emailClean);

emailClean已经是 achar *并且%s需要 achar *所以你实际上想要这样做:

 printf("%s\n", emailClean);

我强烈建议在您的编译器选项中启用所有警告并修复所有警告。

于 2013-06-30T18:51:04.770 回答
1

尝试使用 malloc 语句分配必要的字节并在函数中返回指向它的指针。

您可以将字符串的最大大小作为参数传递给您的函数,这样您就可以知道要分配多少字节。或者您可以使用另一种方法来查找要分配的大小,例如查找值为 0 的第一个字符(以防 o C 以空字符结尾的字符串)。

然后,只需执行以下操作:

emailNew = malloc(max_bytes);

然后,在函数之外,您可以使用“free”语句来释放您使用 malloc 分配的内存。

于 2013-06-30T19:02:15.467 回答
0

正如已经诊断的那样,您的函数decode()没有正确分配空间。

但是,它也遇到了另一个(以前未诊断的)问题;如果电子邮件地址不包含 a %,它会读取无关的内存,直到在某处找到一个。不太严重的是,变量y没有做任何有用的事情;您初始化并增加它,但从不读取它的值。

我认为代码应该写得更像:

char *decode(char *url)
{
    char *emailNew;
    char *end = strchr(url, '%');
    if (end == 0)
        end = url + strlen(url);
    emailNew = malloc(end - url + 1);
    if (emailNew != 0)
    {
        memmove(emailNew, url, end - url);  // Or memcpy()
        emailNew[end - url] = '\0';
    }
    return emailNew;
}

这使用标准 C 库函数在字符串中查找字符 — strchr()。如果找不到百分号,则使用整个字符串。分配足够的空间;如果成功,将字符串(可能不是空终止)复制到分配的空间并空终止字符串。然后返回数据。

您还可以按照以下方式在您的函数中进行搜索来重写它:

char *decode(char *url)
{
    char *emailNew;
    int i;
    char current;

    for (i = 0; (current = url[i]) != '%' && current != '\0'; i++)
        ;

    emailNew = malloc(i + 1);
    if (emailNew != 0)
    {
        memmove(emailNew, url, i);
        emailNew[i] = '\0';
    }
    return emailNew;
}
于 2013-06-30T19:32:37.663 回答