2013-06-30 42 views
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; 
} 

谢谢!

+0

可能要修复您的格式;更容易发现错误。 – Ponkadoodle

回答

1

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

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

然后,就这样做:

emailNew = malloc(max_bytes); 

然后,在函数外,你可以使用“免费”的语句来取消分配您使用malloc分配的内存。

+0

欢迎来到Stack Overflow。请尽快阅读[常见问题],并请在句子开头使用大写字母。我不确定你如何从'char current = url [i];'中推导'分配的数组大小为0'。我看到一个初始化为URL字符串的第一个字符的简单变量定义。 –

+0

谢谢乔纳森,你说得对阵的阵列不是0号。我要纠正这一点,无论如何,我看到你已经给出了更完整的答案。感谢您的欢迎。 –

1
char *emailNew; 

    /* ... */ 

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

emailNew指针没有被初始化,因此emailNew[i] = current分配调用未定义的行为。

另外:

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

emailClean已经是一个char *%s需要char *所以你真的想这样做:

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

我强烈建议,以确保您的编译器选项的所有警告和修复所有警告。

+0

特别打开警告! –

+0

谢谢,我现在就开始工作! –

0

如已经诊断,您的功能decode()没有正确分配空间。

但是,它也遇到了另一个(以前未确诊)的问题;如果电子邮件地址不包含%,则它将读取无关内存,直到找到某处。不太重要的是,变量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()。如果它没有找到百分号,则使用整个字符串。分配足够的空间;如果这是成功的,则将字符串(可能不是null结尾)复制到分配的空间中,并且null结束字符串。然后返回数据。

你也可以把它改写在做线沿线的你的函数搜索:

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; 
} 
相关问题