我是C的新手,我正在尝试将一个从主函数之后的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 :(得分: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);
我强烈建议您在编译器选项中启用所有警告并修复所有警告。
答案 1 :(得分:1)
尝试使用malloc语句分配必要的字节并在函数中返回指向它的指针。
您可以将字符串的maxsize作为参数传递给函数,以便了解要分配的字节数。 或者您可以使用另一种方法来查找要分配的大小,例如查找值为0的第一个字符(如果是C C null终止字符串)。
然后,就这样做:
emailNew = malloc(max_bytes);
然后,在函数外部,您可以使用“free”语句释放您使用malloc分配的内存。
答案 2 :(得分: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终止该字符串。然后返回数据。
你也可以按照以下方式重写它在你的函数中进行搜索:
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;
}